Arka planlı bir alt sürecin pid'i $! . Tüm alt süreçlerin pid'lerini bir dizide saklayabilirsiniz, örneğin PIDS [] .
wait [-n] [jobspec or pid …]
Her işlem kimliği pid veya iş belirtimi iş belirtimi tarafından belirtilen alt işlemin çıkmasını bekleyin ve beklenen son komutun çıkış durumuna dönün. Bir iş spesifikasyonu verilmişse, işteki tüm süreçler beklenir. Hiçbir bağımsız değişken belirtilmezse, şu anda etkin olan tüm alt süreçler beklenir ve dönüş durumu sıfırdır. -N seçeneği sağlanırsa, herhangi bir işin sona ermesini bekler ve çıkış durumuna döner. Ne jobspec ne de pid kabuğun aktif bir çocuk sürecini belirtmiyorsa, dönüş durumu 127'dir.
Wait komutunu kullanın , tüm alt işlemlerin bitmesini bekleyebilirsiniz, bu arada her çocuk işlemin çıkış durumunu $? ve durumu STATUS [] içine kaydedin . Ardından duruma göre bir şeyler yapabilirsiniz.
Aşağıdaki 2 çözümü denedim ve iyi çalışıyorlar. solution01 ederken, daha özlü solution02 karmaşık biraz.
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