Führen Sie zwei oder mehr Befehle gleichzeitig im Shell-Skript aus
Es ist oft sehr hilfreich, Befehle in einem Shell-Skript parallel auszuführen, aber ich kann keine Möglichkeiten finden, dies zu tun. Ist das möglich? Wenn ja, wie würde ich das erreichen? Ich bin hauptsächlich daran interessiert, das 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 erforderlich ist, bis alles abgeschlossen ist.
Antworten
Der grundlegendste Ansatz ist mit &
, diese andere Antwort ist richtig. Es befürwortet auch nohup
, nohup
leitet aber stdin, stdout und stderr um, etwas, das Sie vielleicht wollen oder nicht wollen. Lesen Unterschied zwischen nohup, disownund& und eine fundierte Entscheidung treffen.
Ein anderer Ansatz ist parallel
. Dies ist hilfreich, wenn Befehle, die Sie parallelisieren möchten, einander ähnlich sind und Sie ein Muster erstellen können.
Mit der Basisvariante des Tools (von moreutils
, zumindest in Debian ) können Sie die Anzahl der gleichzeitig ausgeführten Jobs begrenzen. GNUparallel ist weiter fortgeschritten. Wenn Jobs, die Sie ausführen möchten, eine Ausgabe generieren, sind die folgenden Optionen besonders nützlich:
--group
Gruppenausgabe. Die Ausgabe jedes Jobs wird zusammengefasst und erst gedruckt, wenn der Befehl beendet ist. Stdout (Standardausgabe) zuerst gefolgt von stderr (Standardfehler). […]
( Quelle )
( --group
ist standardmäßig aktiviert, daher müssen Sie es normalerweise nicht explizit verwenden.)
--keep-order
-k
Halten Sie die Reihenfolge der Ausgabe in der Reihenfolge der Eingabe. Normalerweise wird die Ausgabe eines Auftrags gedruckt, sobald der Auftrag abgeschlossen ist. […]-k
Betrifft nur die Reihenfolge, in der die Ausgabe gedruckt wird - nicht die Reihenfolge, in der Jobs ausgeführt werden.
( Quelle )
Mit ihnen wird die Ausgabe von mehreren Jobs organisiert, etwas, von dem Sie nicht bekommen können &
. Manchmal interessiert Sie die Ausgabe nicht, aber die Reihenfolge. wie in meiner Antwort, in der GNU verwendet parallel
wird, um mehrere curl
Prozesse zu parallelisieren und den Exit-Status von jedem zu erhalten, wobei die Sequenz beibehalten wird.
In Debian befindet sich GNU parallel
in einem Paket namens parallel
. Als separate ausführbare Datei parallel
kann von jeder Shell ausgeführt werden.
Der beste Weg, dies zu tun, besteht darin, die nohup
Voreinstellung des Befehls mit &
dem am Ende des Befehls angehängten zu kombinieren
Unklar, was Ihr Kernziel ist, aber ich hoffe, das hilft!
Um einen Befehl als Hintergrundprozess auf einem Linux-Computer auszuführen, sollten Sie dem Befehl ein Präfix voranstellen nohupund &
an das Ende anhängen .
Der letzte Befehl wäre also:
nohup [your command] &
Das nohup
bedeutet, dass der Befehl "Auflegen" ignorieren sollte und das &
angehängte kaufmännische Und ein Shell-Befehl ist, der das System anweist, den Befehl als Hintergrundprozess auszuführen. Weitere Informationen zur Verwendung finden Sie hier .
Wenn Sie einen Befehl wie diesen ausführen, wird der Prozess ausgeführt, Sie werden zur Eingabeaufforderung zurückgeschickt und Sie können die Terminalsitzung beenden oder während dieser Terminalsitzung etwas anderes tun, das nicht mit diesem Befehl zusammenhängt.