
Ich versuche, ein Shell-Skript zu erstellen, um eine Reihe von Prozessen mit langer Laufzeit zu starten. Nennen wir sie a, b, c, d und e. Die Prozesse b, c und d sollten parallel laufen, und Prozess e muss laufen, nachdem alle vorherigen beendet wurden.erfolgreich.
Hier ist mein (Pseudo-)Code:
{
echo "starting a"
a
}&&
{
(echo "starting b"; b; exit $?)&
(echo "starting c"; c; exit $?)&
(echo "starting d"; d; exit $?)&
wait
}&&
{
echo "starting e"
e
}
Mein Problem ist, dass das Skript fortgesetzt wird und e ausführt, wenn einer von b, c oder d fehlschlägt. Gibt es eine Möglichkeit, das zu verhindern?
Vielen Dank für alle Antworten!
Antoine
Antwort1
{
(echo "starting b"; b)&
(echo "starting c"; c)&
(echo "starting d"; d)&
wait %1 && wait %2 && wait %3
}&&
beim Warten auf einen bestimmten Job wait
wird der Exit-Code dieses Jobs zurückgegeben
Zum Verständnis sehen Sie sich diese beiden Beispiele an:
nur die letzte Zeile ist wichtig (zeigt den Exit-Status von wait
)
(sleep 3; false) & wait; echo $?
[1] 25358
[1]+ Exit 1 ( sleep 3; false )
0
--
(sleep 3; false) & wait %1; echo $?
[1] 25362
[1]+ Exit 1 ( sleep 3; false )
1
Antwort2
Indem Sie einen Prozess im Hintergrund ausführen, teilen Sie der Shell grundsätzlich mit, dass sein Erfolg oder Misserfolg Sie nicht interessiert.
wait
WilleMelden Sie den Wert eines Signals in seinem Exit-Code, falls zutreffend. Das ist nicht das, wonach Sie suchen.
Eine Lösung wäre, jeden Befehl seinen Status an stdout melden zu lassen und die Antworten mit grep zu zählen.
{
(echo "starting b"; b && echo ok)&
(echo "starting c"; c && echo ok)&
(echo "starting d"; d && echo ok)&
} |
grep -c ok | ( read n && (( n==3 )) ) &&
{
echo "starting e"; e
}