Ich schreibe ein Drehbuch, aber es gibt etwas, das ich brauche, damit ich es nicht schaffen kann ...
Ich muss einen Befehl im Hintergrund "command1 &" ausführen und dann irgendwo im Skript darauf warten, dass er beendet wird, bevor ich command2 ausführe. Grundsätzlich brauche ich das:
HINWEIS: Jeder Befehl wird in einem bestimmten Verzeichnis ausgeführt! Am Ende der while-Schleife hat mein Befehl1 4 Verzeichnisse erstellt, in denen jeweils der spezifische Prozess ausgeführt wird, sodass insgesamt 4 Prozesse ausgeführt werden
a=1
while [$a -lt 4 ]
. command1
#Generates 1 Process
a= `export $a +1`
done
#Wait until the 4 process end and then run the command2
. command2
Ich habe etwas über einen wait
Befehl mit der PID-Prozessnummer gesehen, aber das hat auch nicht funktioniert.
shell
scripting
background-process
Joao Macau
quelle
quelle
command1
? Können Sie es so ändern, dass es die PIDs der 4 Prozesse zurückgibt?$!
Variable verwenden, um sie an denwait
Befehl zu übergeben, wie ich dort gezeigt habe.$!
enthält die zuletzt hinterlegte PID, während$$
die PID des letzten Prozesslaufs enthalten ist.Antworten:
Mit dem Befehl können Sie
wait PID
warten, bis ein Prozess beendet ist.Sie können auch die PID des letzten Befehls mit abrufen
$!
In Ihrem Fall würde so etwas funktionieren:
Nach der Bearbeitung können Sie Folgendes tun, da Sie über mehrere PIDs verfügen und diese kennen:
quelle
Am
comamnd1
einfachsten ist es, wenn Sie die PIDs der gestarteten Prozesse zurückgeben undwait
auf jeden von ihnen anwenden, wie in der Antwort von @ LaurentC angegeben .Ein anderer Ansatz wäre etwa so:
quelle
Wenn Sie die folgende Methode verwenden, benötigen Sie nach der while-Schleife möglicherweise kein spezielles "Warten auf alle Prozesse". Die Schleife wartet auf den Abschluss des Stroms
command1
, bevor sie nach oben wechselt. Bitte seien Sie vorsichtig, wie bei jedem Ratschlag. Beachten Sie, das einzige, was ich getan habe, war& wait $!
, das Ende Ihrer Liste zu ergänzencommand1
.quelle