Führen Sie Befehle parallel aus und warten Sie, bis eine Befehlsgruppe abgeschlossen ist, bevor Sie mit der nächsten beginnen

12

Ich habe ein Skript mit mehreren Befehlen. Wie kann ich Befehle gruppieren, um sie zusammen auszuführen (ich möchte mehrere Gruppen von Befehlen erstellen? Innerhalb jeder Gruppe sollten die Befehle parallel (gleichzeitig) ausgeführt werden. Die Gruppen sollten nacheinander ausgeführt werden und warten, bis eine Gruppe fertig ist, bevor sie gestartet werden nächste Gruppe) ... dh

#!/bin/bash
command #1
command #2
command #3
command #4
command #5
command #6
command #7
command #8
command #9
command #10

Wie kann ich alle 3 Befehle zusammen ausführen? Ich habe es versucht:

#!/bin/bash
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10

Dies hat jedoch nicht ordnungsgemäß funktioniert (ich möchte die Befehlsgruppen gleichzeitig parallel ausführen. Außerdem muss ich warten, bis die erste Gruppe fertig ist, bevor ich die nächste Gruppe ausführe.)

Das Skript wird mit einer Fehlermeldung beendet!

RobertL
quelle
2
Was meinst du, lauf zusammen. Meinst du gleichzeitig parallel laufen? Woher weißt du, dass es "nicht richtig funktioniert hat"? Woher wissen Sie, wann es richtig funktioniert? Möchten Sie warten, bis die erste Gruppe fertig ist, bevor Sie die nächste Gruppe ausführen?
RobertL
@ RobertL.Ja meine ich gleichzeitig parallel. Das Skript wird mit einer Fehlermeldung beendet. Ja, ich muss warten, bis die erste Gruppe fertig ist, bevor ich die nächste Gruppe ausführe.
1
@goro zitiert Sie, das Skript wird mit einer Fehlermeldung beendet. Bitte bearbeiten Sie Ihre Frage, um eine solche Nachricht hinzuzufügen (der Vollständigkeit halber) und entfernen Sie den Chat (Ratschläge sind willkommen).
Dave_alcarin
Wird in jeder Instanz derselbe Befehl ausgeführt? Gleicher Name?
RobertL
1
@goro, ist das richtig? "Sie haben mehrere Gruppen von Befehlen. Innerhalb jeder Gruppe sollten die Befehle parallel (gleichzeitig) ausgeführt werden. Die Gruppen sollten nacheinander ausgeführt werden und darauf warten, dass eine Gruppe beendet wird, bevor die nächste Gruppe gestartet wird."
RobertL

Antworten:

20

Die Befehle in jeder Gruppe werden parallel ausgeführt, und die Gruppen werden nacheinander ausgeführt. Jede Gruppe paralleler Befehle wartet darauf, dass die vorherige Gruppe beendet wird, bevor die Ausführung gestartet wird.

Das Folgende ist ein Arbeitsbeispiel:

Angenommen, 3 Befehlsgruppen wie im folgenden Code. In jeder Gruppe werden die drei Befehle im Hintergrund mit gestartet &.

Die 3 Befehle werden fast gleichzeitig gestartet und parallel ausgeführt, während das Skript ausgeführt wird waits.

Nachdem alle drei Befehle in der dritten Gruppe beendet wurden, command 10wird Exit ausgeführt.

$ cat command_groups.sh 
#!/bin/sh

command() {
    echo $1 start
    sleep $(( $1 & 03 ))      # keep the seconds value within 0-3
    echo $1 complete
}

echo First Group:
command 1 &
command 2 &
command 3 &
wait

echo Second Group:
command 4 &
command 5 &
command 6 &
wait

echo Third Group:
command 7 &
command 8 &
command 9 &
wait

echo Not really a group, no need for background/wait:
command 10

$ sh command_groups.sh 
First Group:
1 start
2 start
3 start
1 complete
2 complete
3 complete
Second Group:
4 start
5 start
6 start
4 complete
5 complete
6 complete
Third Group:
7 start
8 start
9 start
8 complete
9 complete
7 complete
Not really a group, no need for background/wait:
10 start
10 complete
$   
RobertL
quelle
Ich denke jedoch, dass die Locken in Ihrem Beispiel völlig bedeutungslos sind. Warten ist prozessglobal, und die gekräuselten Gruppen erstellen in diesem Fall keine neue Verzweigung.
PSkocik
1
@ PSkocik, stimmt. Restorgane.
RobertL
6
{
command #1
command #2
command #3
} & 
{   
command #4
command #5
command #6
} & 
{
command #7
command #8
command #9
}&
command #10
wait #<===

Sollte funktionieren (jede einzelne Triplett-Komponente wird nacheinander ausgeführt, die Gruppen werden jedoch parallel ausgeführt). Sie möchten wahrscheinlich nicht, dass Ihre übergeordnete Shell beendet wird, bevor die Gruppen beendet sind - daher die wait.

PSkocik
quelle
2
Die ursprüngliche Frage lautete nur "Alle 3 Befehle zusammen ausführen". Ohne Klarstellung ist jede Antwort richtig. Guter Anruf auf der wait.
RobertL