tôi không thích sử dụng wait
bởi vì nó bị chặn cho đến khi thoát quá trình, mà không phải là lý tưởng khi có nhiều quá trình chờ đợi trên như tôi có thể' t nhận được cập nhật trạng thái cho đến khi quá trình hiện tại được thực hiện. Tôi thích sử dụng kết hợp của kill -0
và sleep
cho điều này.
Cho một mảng pids
để chờ, tôi sử dụng chức năng dưới đây waitPids()
để nhận phản hồi liên tục về những gì vẫn đang chờ xử lý để kết thúc.
declare -a pids
waitPids() {
while [ ${#pids[@]} -ne 0 ]; do
echo "Waiting for pids: ${pids[@]}"
local range=$(eval echo {0..$((${#pids[@]}-1))})
local i
for i in $range; do
if ! kill -0 ${pids[$i]} 2> /dev/null; then
echo "Done -- ${pids[$i]}"
unset pids[$i]
fi
done
pids=("${pids[@]}") # Expunge nulls created by unset.
sleep 1
done
echo "Done!"
}
Khi tôi bắt đầu một quá trình ở chế độ nền, tôi thêm pid của nó ngay lập tức đến các mảng pids
bằng cách sử dụng dưới đây chức năng tiện ích:
addPid() {
desc=$1
pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
Đây là một mẫu cho thấy làm thế nào để sử dụng:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
Và đây là cách phản hồi trông:
Sleep for 2 -- 36271
Sleep for 3 -- 36272
Sleep for 4 -- 36273
Sleep for 5 -- 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Waiting for pids: 36271 36272 36273 36274
Done -- 36271
Waiting for pids: 36272 36273 36274
Done -- 36272
Waiting for pids: 36273 36274
Done -- 36273
Waiting for pids: 36274
Done -- 36274
Done!
Bạn đã miscapitalized các do_something ... tên ;-) –
Got it - gì về khi tôi muốn chắc chắn rằng tôi chỉ là chạy 50 trường hợp cùng một lúc? Và - khi một trong những quy trình đó được thực hiện, hãy đảm bảo thêm 1 lần nữa được sinh ra. – Greg
Sử dụng nội dung 'công việc' bash. –