Pid фонового дочернего процесса хранится в $! , Вы можете хранить идентификаторы всех дочерних процессов в массиве, например, PIDS [] .
wait [-n] [jobspec or pid …]
Подождите, пока дочерний процесс, указанный в каждом идентификаторе процесса или спецификации задания, не завершится, и не вернет статус выхода последней ожидаемой команды. Если задана спецификация задания, ожидаются все процессы в задании. Если аргументы не указаны, ожидаются все активные в данный момент дочерние процессы, и статус возврата равен нулю. Если указана опция -n, wait ожидает завершения любого задания и возвращает его статус завершения. Если ни jobpec, ни pid не указывают активный дочерний процесс оболочки, статус возврата - 127.
Используйте команду wait, вы можете дождаться завершения всех дочерних процессов, в то время как вы можете получить статус выхода каждого дочернего процесса с помощью $? и сохранить статус в СТАТУС [] . Тогда вы можете делать что-то в зависимости от статуса.
Я пробовал следующие 2 решения, и они работают хорошо. solution01 более лаконичен, а solution02 немного сложнее.
solution01
#!/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
solution02
#!/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