Die PID eines untergeordneten Hintergrundprozesses wird in $ gespeichert ! . Sie können die Pids aller untergeordneten Prozesse in einem Array speichern, z . B. PIDS [] .
wait [-n] [jobspec or pid …]
Warten Sie, bis der untergeordnete Prozess, der von jeder Prozess-ID-PID oder Jobspezifikation angegeben wird, beendet wird, und geben Sie den Beendigungsstatus des zuletzt warteten Befehls zurück. Wenn eine Jobspezifikation angegeben ist, wird auf alle Prozesse im Job gewartet. Wenn keine Argumente angegeben werden, wird auf alle derzeit aktiven untergeordneten Prozesse gewartet, und der Rückgabestatus ist Null. Wenn die Option -n angegeben ist, wartet wait auf das Beenden eines Jobs und gibt seinen Beendigungsstatus zurück. Wenn weder jobspec noch pid einen aktiven untergeordneten Prozess der Shell angeben, lautet der Rückgabestatus 127.
Mit dem Befehl wait können Sie warten, bis alle untergeordneten Prozesse abgeschlossen sind. In der Zwischenzeit können Sie den Exit-Status aller untergeordneten Prozesse über $? Abrufen. und speichern Sie den Status in STATUS [] . Dann können Sie je nach Status etwas tun.
Ich habe die folgenden 2 Lösungen ausprobiert und sie laufen gut. Lösung01 ist prägnanter, während Lösung02 etwas kompliziert ist.
Lösung01
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
PIDS+=($!)
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS+=($?)
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done
Lösung02
#!/bin/bash
# start 3 child processes concurrently, and store each pid into array PIDS[].
i=0
process=(a.sh b.sh c.sh)
for app in ${process[@]}; do
./${app} &
pid=$!
PIDS[$i]=${pid}
((i+=1))
done
# wait for all processes to finish, and store each process's exit code into array STATUS[].
i=0
for pid in ${PIDS[@]}; do
echo "pid=${pid}"
wait ${pid}
STATUS[$i]=$?
((i+=1))
done
# after all processed finish, check their exit codes in STATUS[].
i=0
for st in ${STATUS[@]}; do
if [[ ${st} -ne 0 ]]; then
echo "$i failed"
else
echo "$i finish"
fi
((i+=1))
done