Pid procesu potomnego w tle jest przechowywany w $! . Możesz przechowywać pidy wszystkich procesów potomnych w tablicy, np. PIDS [] .
wait [-n] [jobspec or pid …]
Zaczekaj, aż proces potomny określony przez każdy identyfikator procesu pid lub specyfikację zadania jobspec zakończy działanie i zwróć kod zakończenia ostatniej oczekiwanej komendy. Jeśli podano specyfikację zadania, oczekiwane są wszystkie procesy w zadaniu. Jeśli nie podano żadnych argumentów, czekane są wszystkie aktualnie aktywne procesy potomne, a zwracany kod wynosi zero. Jeśli podano opcję -n, wait czeka na zakończenie dowolnego zadania i zwraca jego kod zakończenia. Jeśli ani specyfikacja zadania, ani pid nie określają aktywnego procesu potomnego powłoki, zwracany jest kod 127.
Użyj polecenia czekaj , możesz poczekać na zakończenie wszystkich procesów potomnych, w międzyczasie możesz uzyskać status zakończenia każdego procesu potomnego za pomocą $? i zapisz status w STATUS [] . Następnie możesz zrobić coś w zależności od statusu.
Wypróbowałem następujące 2 rozwiązania i działają dobrze. rozwiązanie01 jest bardziej zwięzłe, podczas gdy rozwiązanie02 jest trochę skomplikowane.
rozwiązanie01
#!/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
rozwiązanie02
#!/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