Mit bash
, werden Sie diese Garantie haben , wenn Sie einen anderen Hintergrund - Job begonnen haben (die Hintergrundjobs und passen sie mit gestartet werden , &
sondern auch mit coproc
und mit Prozess - Substitution) zwischen der foo &
und der wait
.
POSIX erfordert, dass sich eine Shell den Exit-Status von mindestens 25 Jobsbash
merkt, nachdem diese nicht mehr vorhanden sind , sich aber noch viel mehr merkt.
Nun, wenn Sie dies tun:
foo & pid=$!
...
bar &
wait "$pid"
Sie haben keine Garantie, dass Sie bar
nicht die gleiche PID erhalten wie foo
(wenn foo
sie zu bar
Beginn der Zeit beendet wurde ). Auch wenn dies unwahrscheinlich ist, wait "$pid"
können Sie den Beendigungsstatus von erhalten bar
.
Sie können es reproduzieren mit:
bash -c '(exit 12; foo) & pid=$!
while : bar & [ "$pid" != "$!" ]; do :;done
wait "$pid"; echo "$?"'
was wird (irgendwann) geben Sie 0
statt 12
.
Um das Problem zu vermeiden, wäre eine Möglichkeit, es wie folgt zu schreiben:
{
foo_pid=$!
while ps -p "$foo_pid"
do
ping -c 1 localhost
done
bar &
...
read <&3 ret
if [ "$ret" = 0 ]; then
echo foo was sucessful.
fi
} 3< <(foo > logfile 2>&1; echo "$?")
wait
funktioniert nicht. Der Prozess wird erfasst und der Beendigungsstatus verworfen, kurz bevor die Eingabeaufforderung angezeigt wird (Standardeinstellung).wait %1
schlägt mit "no such job" fehl, da der Hintergrundprozess unmittelbar nach Abschluss von "sleep 5" erfasst wird.%1
anstelle von vermisst$!
.bash -c '(sleep 1;exit 5) & sleep 2; wait %1; echo $?'
(auch nicht interaktiv) der Beendigungsstatus dieses toten Jobs nicht abgerufen werden kann. Klingt nach einem Bug.Ich glaube, Ihre Annahme ist richtig. Hier ist ein Auszug aus dem
man bash
Warten auf Hintergrundprozesse.Vielleicht solltest du nach 127 Ausschau halten
Es gibt eine ähnliche Frage mit einer völlig anderen Antwort, als sie helfen könnte.
Bash-Skript wartet auf Prozesse und ruft den Rückkehrcode ab
bearbeiten 1
Inspiriert von @ Stephanes Kommentaren und Antworten habe ich sein Skript erweitert. Ich kann ungefähr 34 Hintergrundprozesse starten, bevor es anfängt, den Überblick zu verlieren.
tback
auf meinem system produziert
quelle
bash -c '(exit 12) & sleep 1; wait "$!"; echo "$?"'
bash
losen Weg gesehen (selbst nach dem Start von Tausenden von Jobs). Mein Beispiel zeigte, dass die PID wiederverwendet wird, was Sie vielleicht auch in Ihrem Fall beobachtet haben.