Führen Sie zwei oder mehr Befehle gleichzeitig im Shell-Skript aus

Nov 28 2020

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

5 KamilMaciorowski Nov 28 2020 at 16:03

Der grundlegendste Ansatz ist mit &, diese andere Antwort ist richtig. Es befürwortet auch nohup, nohupleitet 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 )

( --groupist 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. […] -kBetrifft 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 parallelwird, um mehrere curlProzesse zu parallelisieren und den Exit-Status von jedem zu erhalten, wobei die Sequenz beibehalten wird.

In Debian befindet sich GNU parallelin einem Paket namens parallel. Als separate ausführbare Datei parallelkann von jeder Shell ausgeführt werden.

2 Giacomo1968 Nov 28 2020 at 11:12

Der beste Weg, dies zu tun, besteht darin, die nohupVoreinstellung 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 nohupbedeutet, 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.