我不喜欢使用wait
,因为它在进程退出之前被阻塞,当有多个进程等待时,这并不理想,因为在当前进程完成之前我无法获得状态更新。我更喜欢使用kill -0
和的组合sleep
。
pids
给定一个等待的数组,我使用下面的waitPids()
函数来获得关于哪些 pid 仍然等待完成的持续反馈。
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!"
}
pids
当我在后台启动一个进程时,我使用下面的实用函数将其 pid 立即添加到数组中:
addPid() {
local desc=$1
local pid=$2
echo "$desc -- $pid"
pids=(${pids[@]} $pid)
}
这是一个演示如何使用的示例:
for i in {2..5}; do
sleep $i &
addPid "Sleep for $i" $!
done
waitPids
以下是反馈的外观:
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!