it-swarm.com.de

Aufrufen mehrerer Bash-Skripte und paralleles Ausführen, nicht nacheinander

Angenommen, ich habe drei (oder mehr) Bash-Skripte: script1.sh, script2.sh Und script3.sh. Ich möchte alle drei dieser Skripte aufrufen und in 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 einige Stunden oder Tage dauern, bis die Skripte fertig sind. Daher möchte ich Nohup verwenden, damit sie auch dann weiter ausgeführt werden, wenn meine Konsole geschlossen wird.)

Aber gibt es eine Möglichkeit, diese drei Befehle in parallel mit einem single -Aufruf auszuführen?

Ich dachte so etwas wie

Nohup bash script{1..3}.sh &

dies scheint jedoch script1.sh, script2.sh und script3.sh nacheinander und nicht parallel auszuführen.

20
Andrew
for((i=1;i<100;i++)); do Nohup bash script${i}.sh & done
15
Hauke Laging

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, mit mehr Kontrolle über die Jobs.

Im folgenden Befehl wird script{1..3}.sh Erweitert und als Argumente parallel an bash gesendet. Hier gibt -j0 An, dass so viele Jobs wie möglich ausgeführt werden sollen. Standardmäßig führt parallel einen Job für einen CPU-Kern aus.

$ parallel -j0 bash :::: <(ls script{1..3}.sh)

Und Sie können es auch versuchen

$ parallel -j0 bash ::: script{1..3}.sh

Wenn Sie beim Ausführen der zweiten Methode eine Fehlermeldung erhalten, bedeutet dies, dass die Option --tollef In /etc/parallel/config Festgelegt ist und gelöscht werden muss, damit alles einwandfrei funktioniert.

Sie können die Manpage GNU Parallelshier lesen, um weitere Optionen zu erhalten.

Und falls Sie die Jobs von einem Remotecomputer ausführen, verwenden Sie besser screen , damit die Sitzung aufgrund von Netzwerkproblemen nicht geschlossen wird. Nohup ist nicht erforderlich, da neuere Versionen von bash mit huponexit als off geliefert werden und dies verhindert, dass die übergeordnete Shell während ihrer Zeit ein HUP -Signal an ihre untergeordneten Elemente sendet sein Ausgang. Falls es nicht deaktiviert ist, tun Sie es mit

$ shopt -u huponexit  
14
Kannan Mohan

Wir können auch xargs verwenden, um mehrere Skripte parallel auszuführen.

$ ls script{1..5}.sh|xargs -n 1 -P 0 bash

hier wird jedes Skript separat als Argument an bash übergeben. -P 0 gibt an, dass die Anzahl der parallelen Prozesse so hoch wie möglich sein kann. Es ist auch sicherer, die Bash-Standardeinstellung job control feature(&).

9
Yaalie

Eine einzelne Linie Lösung:

$ Nohup bash script1.sh & Nohup bash script2.sh & Nohup bash script3.sh &

Verwenden Sie weniger scherzhaft ein Wrapper-Skript:

$ cat script.sh
#!/usr/bin/env bash
script1.sh &
script2.sh &
script3.sh &
$ Nohup script.sh &

Oder über sie schleifen:

for script in dir/*.sh
do
    Nohup bash "$script" &
done
5
l0b0

Wenn Sie sich einen Tippaufwand ersparen möchten

eval "Nohup bash "script{1..3}.sh" &"

Oder vielleicht auch nicht

2
iruvar

Testen Sie dieses Tool: https://github.com/wagoodman/bashful

Angenommen, Sie haben mytasks.yaml mit

tasks:
    - name: A title for some tasks
      parallel-tasks:
        - cmd: ./script1.sh
        - cmd: ./script2.sh -x an-arg
        - cmd: ./script3.sh -y some-other-arg

Und du machst es so:

Nohup bashful run mytasks.yaml

Ihre Skripte werden parallel zu einem vertikalen Fortschrittsbalken ausgeführt (+ eta, wenn Sie ihn zuvor ausgeführt haben und die Zeit deterministisch ist). Sie können festlegen, wie viele Aufgaben Sie parallel ausführen möchten, wenn Sie hier mehr als nur die angegebenen 3 ausführen:

config:
    max-parallel-commands: 6
tasks:
    ...

Haftungsausschluss: Ich bin der Autor.

1
wagoodman

Verwenden Sie eine Parallelschale

parallelshell "echo 1" "echo 2" "echo 3"

https://github.com/keithamus/parallelshell

0
rofrol

Ich schlage ein viel einfacheres Dienstprogramm vor, das ich gerade geschrieben habe. Es heißt derzeit par, wird aber bald in parl oder pll umbenannt, hat sich noch nicht entschieden.

https://github.com/k-bx/par

API ist so einfach wie:

par "script1.sh" "script2.sh" "script3.sh"
0