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

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

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 nohupaber nohupum, was Sie vielleicht wollen oder nicht. Lesen SieUnterschied zwischen nohupunddisown&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.GNUparallelist 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)

( --groupist 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. […] -kwirkt 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 parallelverwendet wird, um mehrere curlProzesse zu parallelisieren und den Beendigungsstatus von jedem abzurufen, wobei die Reihenfolge beibehalten wird.

In Debian GNU parallelbefindet es sich in einem Paket namens parallel. Als separate ausführbare Datei parallelkann es von jeder Shell aus ausgeführt werden.

Antwort2

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

verwandte Informationen