Wie kann man in einem Bash-Skript auf mehrere Unterprozesse warten, die aus diesem Skript hervorgegangen sind, um den Exit-Code zu beenden und zurückzugeben! = 0, wenn einer der Unterprozesse mit Code endet! = 0?
Einfaches Skript:
#!/bin/bash
for i in `seq 0 9`; do
doCalculations $i &
done
wait
Das obige Skript wartet auf alle 10 erzeugten Unterprozesse, gibt jedoch immer den Exit-Status 0 (siehe help wait
). Wie kann ich dieses Skript so ändern, dass es den Beendigungsstatus von erzeugten Unterprozessen erkennt und den Beendigungscode 1 zurückgibt, wenn einer der Unterprozesse mit Code endet! = 0?
Gibt es dafür eine bessere Lösung, als PIDs der Unterprozesse zu sammeln, in der richtigen Reihenfolge auf sie zu warten und den Exit-Status zu summieren?
wait -n
hat ein kleines Problem: Wenn keine untergeordneten Jobs mehr vorhanden sind (auch als Race-Bedingung bezeichnet), wird ein Exit-Status ungleich Null (fehlgeschlagen) zurückgegeben, der von einem fehlgeschlagenen untergeordneten Prozess nicht zu unterscheiden ist.
wait -n
ist in der modernen Bash verfügbar und kann nur zurückgegeben werden, wenn der erste / nächste Befehl abgeschlossen ist.