Pid proses anak latar belakang disimpan di $! . Anda dapat menyimpan semua pids proses anak ke dalam sebuah array, misalnya PIDS [] .
wait [-n] [jobspec or pid …]
Tunggu hingga proses turunan yang ditentukan oleh setiap ID proses pid atau spesifikasi pekerjaan jobspec keluar dan mengembalikan status keluar dari perintah terakhir yang menunggu. Jika spesifikasi pekerjaan diberikan, semua proses dalam pekerjaan akan ditunggu. Jika tidak ada argumen yang diberikan, semua proses anak yang sedang aktif akan ditunggu, dan status kembaliannya adalah nol. Jika opsi -n tersedia, tunggu menunggu pekerjaan apa pun berhenti dan mengembalikan status keluarnya. Jika baik jobspec maupun pid menentukan proses turunan aktif dari shell, status kembaliannya adalah 127.
Gunakan perintah wait Anda bisa menunggu semua proses anak selesai, sementara Anda bisa mendapatkan status keluar dari setiap proses anak melalui $? dan menyimpan status ke STATUS [] . Kemudian Anda dapat melakukan sesuatu tergantung status.
Saya telah mencoba 2 solusi berikut dan semuanya berjalan dengan baik. solution01 lebih ringkas, sedangkan solution02 sedikit rumit.
solusi01
#!/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
solusi02
#!/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