
Es ist oft sehr hilfreich, Befehle parallel in einem Shell-Skript auszuführen, aber ich finde keine Möglichkeit, dies zu tun. Ist das möglich? Und wenn ja, wie würde ich das erreichen? Ich bin hauptsächlich daran interessiert, dies für zu tun fish
.
Dies ist nützlich, wenn ich Befehle ausführe, deren Ausführung lange dauert, die aber gleichzeitig ausgeführt werden können oder müssen, um die Zeit zu verkürzen, die für die Fertigstellung aller Vorgänge benötigt wird.
Antwort1
Der grundlegendste Ansatz ist mit &
,diese andere Antwortist richtig. Es befürwortet auch stdin, stdout und stderr, leitet diese nohup
aber nohup
um, was Sie vielleicht wollen oder nicht. Lesen SieUnterschied zwischen nohup
unddisown
&
und treffen Sie eine fundierte Entscheidung.
Ein anderer Ansatz ist parallel
.Dies ist nützlich, wenn Befehle, die Sie parallelisieren möchten,einander ähnlichund Sie können ein Muster erstellen.
Basisvariante des Tools (ab moreutils
, mindestensin Debian) können Sie die Anzahl gleichzeitig ausgeführter Jobs begrenzen.GNUparallel
ist fortgeschrittener. Wenn Jobs, die Sie ausführen möchten, Ausgaben generieren, sind die folgenden Optionen besonders nützlich:
--group
Gruppieren Sie die Ausgabe. Die Ausgabe jedes Jobs wird gruppiert und erst gedruckt, wenn der Befehl abgeschlossen ist. Zuerst kommt stout (Standardausgabe), gefolgt von stderr (Standardfehler). […]
(Quelle)
( --group
ist standardmäßig aktiviert, daher müssen Sie es normalerweise nicht explizit verwenden.)
--keep-order
-k
Behalten Sie die Ausgabereihenfolge bei, die der Eingabereihenfolge entspricht. Normalerweise wird die Ausgabe eines Auftrags gedruckt, sobald dieser abgeschlossen ist. […]-k
wirkt sich nur auf die Reihenfolge aus, in der die Ausgabe gedruckt wird – nicht auf die Reihenfolge, in der Aufträge ausgeführt werden.
(Quelle)
Mit ihnen wird die Ausgabe mehrerer Jobs organisiert, was Sie mit nicht erreichen können &
. Manchmal ist Ihnen die Ausgabe egal, aber die Reihenfolge ist Ihnen wichtig; wie indiese Antwort von mirwobei GNU parallel
verwendet wird, um mehrere curl
Prozesse zu parallelisieren und den Beendigungsstatus von jedem abzurufen, wobei die Reihenfolge beibehalten wird.
In Debian GNU parallel
befindet es sich in einem Paket namens parallel
. Als separate ausführbare Datei parallel
kann es von jeder Shell aus ausgeführt werden.
Antwort2
Der beste Weg, dies zu tun, besteht darin, nohup
dem Befehl voranzustellen und &
an das Ende des Befehls anzuhängen
Es ist nicht klar, was Ihr Hauptziel ist, aber ich hoffe, es hilft!
Um einen Befehl als Hintergrundprozess auf einem Linux-Rechner auszuführen, sollten Sie dem Befehl Folgendes voranstellen:nohup
&
und an das Ende anhängen .
Der endgültige Befehl wäre also:
nohup [your command] &
Das nohup
bedeutet, dass der Befehl „Aufhänger“ ignorieren soll, und das &
daran angehängte Et-Zeichen ist ein Shell-Befehl, der das System anweist, den Befehl als Hintergrundprozess auszuführen. Weitere Informationen zur Verwendungfinden Sie hier.
Wenn Sie einen Befehl wie diesen ausführen, wird der Prozess ausgeführt, Sie werden zur Eingabeaufforderung zurückgesendet und können die Terminalsitzung beenden oder während der Terminalsitzung sogar etwas anderes tun, das nichts mit diesem Befehl zu tun hat.