Nehmen wir an, dass ich drei (oder mehr) Bash - Skripte: script1.sh
, script2.sh
, und script3.sh
. Ich möchte alle drei Skripte aufrufen und parallel ausführen . Eine Möglichkeit, dies zu tun, besteht darin, einfach die folgenden Befehle auszuführen:
nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
(Im Allgemeinen kann es mehrere Stunden oder Tage dauern, bis die Skripts fertig sind. Daher möchte ich sie verwenden, nohup
damit sie auch dann ausgeführt werden, wenn meine Konsole geschlossen wird.)
Aber ist es eine Möglichkeit , diese drei Befehle in auszuführen parallel mit einem einzigen Anruf?
Ich dachte so etwas wie
nohup bash script{1..3}.sh &
aber dies scheint auszuführen script1.sh
, script2.sh
und script3.sh
in der Reihenfolge, nicht parallel.
nohup bash script{1..100}.sh &
oderfor i in {1..100}; do nohup bash script{1..100} &; done
) einzugeben, anstattnohup bash script*.sh &
100 verschiedene Male einzugeben .screen
auch in (odertmux
) starten , um das Konsolenproblem zu lösen, aber den Zugriff auf die Ausgabe (und Eingabe) zu behalten.nohup ... & nohup ... & nohup ... &
. Wenn Sie stattdessen alle Skripte ausführen möchten, ohne jeden Skriptnamen einzeln einzugeben, wird dies in einer einfachen Schleife ausgeführt.Antworten:
quelle
Ein besserer Weg wäre, GNU Parallel zu verwenden . GNU parallel ist einfach und damit können wir die Anzahl der Jobs steuern, die parallel ausgeführt werden sollen, und die Jobs besser steuern.
Wird im folgenden Befehl
script{1..3}.sh
erweitert und als Argumente anbash
parallel gesendet . Hier wird-j0
angegeben, dass so viele Jobs wie möglich ausgeführt werden sollen. Standardmäßig wirdparallel
ein Job für einen CPU-Kern ausgeführt.Und Sie können es auch mit versuchen
Wenn beim Ausführen der zweiten Methode eine Fehlermeldung angezeigt wird, bedeutet dies, dass die
--tollef
Option aktiviert ist/etc/parallel/config
und gelöscht werden muss, und alles funktioniert.Sie können die
GNU Parallels
Manpage hier lesen , um weitere Optionen zu erhalten.Wenn Sie die Jobs von einem Remotecomputer ausführen, sollten Sie sie besser verwenden,
screen
damit die Sitzung nicht aufgrund von Netzwerkproblemen geschlossen wird.nohup
nicht erforderlich ist, wie die jüngsten Versionen von bash wie kommthuponexit
wie ,off
und dies wird mehr senden Eltern - Shell verhindernHUP
Signal an seine Kinder während seiner Ausfahrt. Wenn es nicht deaktiviert ist, machen Sie es mitquelle
bash
wie die Shellparallel -j0 bash :::: <(ls script{1..3}.sh)
reduziert werden kannparallel -j0 bash :::: script{1..3}.sh
, nein?parallel -j0 bash ::: script{1..3}.sh
?bash ::: script{1..3}.sh
wird weitergegebenparallel
, nicht::: script{1..3}.sh
. So sollte dies zunächst erweiternparallel bash ::: script1.sh script2.sh script3.sh
durch die Schale und dannparallel
Anrufungenbash script1.sh
,bash script2.sh
,bash script3.sh
. Ich habe es versuchtparallel -j0 bash ::: script{1..3}.sh
- dies ist besser als der::::
Ansatz, da keine Prozesssubstitution erforderlich ist. Auch das Parsen der ls-Ausgabe ist mit FallstrickenWir können auch
xargs
mehrere Skripte gleichzeitig ausführen.Hier wird jedes Skript einzeln als Argument an bash übergeben.
-P 0
gibt an, dass die Anzahl der parallelen Prozesse so groß wie möglich sein kann. Es ist auch sicherer, bash default zu verwendenjob control feature
(&)
.quelle
Eine einzeilige Lösung:
Verwenden Sie weniger scherzhaft nur ein Wrapper-Skript:
Oder überfliegen Sie sie:
quelle
Wenn Sie sich das Tippen sparen möchten
Oder vielleicht auch nicht
quelle
Kasse dieses Werkzeug: https://github.com/wagoodman/bashful
Sagen Sie, Sie haben
mytasks.yaml
mitUnd du machst es so:
Ihre Skripte würden parallel mit einem vertikalen Fortschrittsbalken ausgeführt (+ eta, wenn Sie es zuvor ausgeführt haben und die Zeit deterministisch ist). Sie können festlegen, wie viele Aufgaben gleichzeitig ausgeführt werden sollen, wenn Sie mehr als die angegebenen 3 ausführen:
Haftungsausschluss: Ich bin der Autor.
quelle
Ich schlage ein viel einfacheres Dienstprogramm vor, das ich gerade geschrieben habe. Es heißt derzeit par, wird aber bald entweder in parl oder pll umbenannt, hat sich aber noch nicht entschieden.
https://github.com/k-bx/par
API ist so einfach wie:
quelle
Verwenden Sie Parallelschale
https://github.com/keithamus/parallelshell
quelle