Exitcode von parallel laufenden Subshells abrufen

Exitcode von parallel laufenden Subshells abrufen

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 waitwird 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
}

verwandte Informationen