Wie kann man in einem Bash-Skript warten, bis mehrere von diesem Skript erzeugte Unterprozesse beendet sind, und dann einen Exit-Code zurückgeben !=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 gespawnten Unterprozesse, aber es gibt immer den Exit-Status 0
(siehe help wait
). Wie kann ich dieses Skript so ändern, dass es den Exit-Status der gespawnten Unterprozesse erkennt und den Exit-Code 1
wenn einer der Unterprozesse mit Code endet !=0
?
Gibt es dafür eine bessere Lösung als das Sammeln der PIDs der Unterprozesse, das Warten auf sie in der Reihenfolge und die Summe der Exit-Status?
2 Stimmen
Dies könnte erheblich verbessert werden, um auf folgende Punkte einzugehen
wait -n
die in der modernen Bash verfügbar ist, um nur zurückzukehren, wenn der erste/nächste Befehl abgeschlossen ist.0 Stimmen
Wenn Sie mit der Bash testen wollen, versuchen Sie dies: github.com/sstephenson/bats
3 Stimmen
Die aktive Entwicklung von BATS hat sich auf github.com/bats-core/bats-core
3 Stimmen
@CharlesDuffy
wait -n
hat ein kleines Problem: Wenn keine Child-Jobs mehr übrig sind (auch bekannt als Race Condition), wird ein Exit-Status ungleich Null (fail) zurückgegeben, der von einem fehlgeschlagenen Child-Prozess nicht zu unterscheiden ist.0 Stimmen
@drevicko : warten -n Lösung hier: stackoverflow.com/a/59723887/627042
0 Stimmen
Ich habe das in einem Skript gesehen, vielleicht ist es das Richtige. sehr prägnant.
wait < <(jobs -p)
0 Stimmen
Siehe auch: Unix und Linux: Starten Sie einen Hintergrundprozess und prüfen Sie, wann er endet
0 Stimmen
Siehe auch: Exit-Code eines Hintergrundprozesses abrufen