Pid фонового дочірнього процесу зберігається в $! . Ви можете зберігати всі підрозділи дочірніх процесів у масив, наприклад, PIDS [] .
wait [-n] [jobspec or pid …]
Зачекайте, поки дочірній процес, визначений кожним підписом ідентифікатора процесу або специфікацією завдання jobspec, завершиться, і поверніть статус виходу останньої очікуваної команди. Якщо специфікація задана, всі процеси в роботі чекають. Якщо ніяких аргументів не наводиться, чекають усі поточно активні дочірні процеси, а стан повернення дорівнює нулю. Якщо опція -n надається, зачекайте, поки будь-яка робота припиниться, і поверне свій вихідний статус. Якщо ні jobspec, ні pid не визначають активний дочірній процес оболонки, стан повернення - 127.
Використовуйте команду wait, ви можете дочекатися завершення всіх дочірніх процесів, тим часом ви можете отримати статус виходу кожного дочірнього процесу через $? і зберігати статус у STATUS [] . Тоді ви можете робити щось залежно від статусу.
Я спробував наступні 2 рішення, і вони працюють добре. рішення01 є більш стислим, тоді як рішення02 трохи складніше.
рішення01
#!/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
рішення02
#!/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