pid ของกระบวนการลูกที่มีพื้นหลังถูกเก็บไว้ใน$! . คุณสามารถจัดเก็บ pids ทุกกระบวนการที่เด็กเป็นอาร์เรย์เช่นPIDs []
wait [-n] [jobspec or pid …]
รอจนกว่ากระบวนการย่อยที่ระบุโดยแต่ละ ID กระบวนการ pid หรือ jobSpec ข้อมูลจำเพาะของงานออกและส่งคืนสถานะการออกของคำสั่งสุดท้ายที่รอ หากระบุข้อมูลจำเพาะของงานกระบวนการทั้งหมดในงานจะรอ หากไม่มีการให้อาร์กิวเมนต์กระบวนการย่อยที่แอ็คทีฟทั้งหมดจะถูกรอและสถานะการส่งคืนจะเป็นศูนย์ หากมีการระบุอ็อพชัน -n ให้รอจนกว่างานใด ๆ จะยุติและส่งคืนสถานะการออก หากทั้ง jobspec หรือ 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