Pid của một quá trình con nền được lưu trữ trong $! . Bạn có thể lưu trữ tất cả các giá trị quy trình con vào một mảng, ví dụ PIDS [] .
wait [-n] [jobspec or pid …]
Đợi cho đến khi tiến trình con được chỉ định bởi mỗi pid ID quy trình hoặc jobspec đặc tả công việc thoát và trả về trạng thái thoát của lệnh cuối cùng được chờ. Nếu một đặc tả công việc được đưa ra, tất cả các quy trình trong công việc được chờ đợi. Nếu không có đối số nào được đưa ra, tất cả các quy trình con hiện đang hoạt động đều được chờ đợi và trạng thái trả về bằng không. Nếu tùy chọn -n được cung cấp, chờ đợi cho bất kỳ công việc nào kết thúc và trả về trạng thái thoát của nó. Nếu cả jobspec và pid chỉ định một tiến trình con hoạt động của shell, trạng thái trả về là 127.
Sử dụng lệnh chờ bạn có thể đợi cho tất cả các tiến trình con kết thúc, trong khi đó bạn có thể nhận trạng thái thoát của từng tiến trình con thông qua $? và lưu trữ trạng thái vào TÌNH TRẠNG [] . Sau đó, bạn có thể làm một cái gì đó tùy theo tình trạng.
Tôi đã thử 2 giải pháp sau đây và chúng chạy tốt. Solution01 ngắn gọn hơn, trong khi Solution02 hơi phức tạp.
giải pháp01
#!/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
dung dịch02
#!/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