简短版本:我的bash脚本有一个函数。
然后,此函数在后台启动另一个函数的多个实例(最多 10 个)(带有 &
)。
我计算了有多少人仍然活跃在 do 循环中的jobs -p | wc -w
中。当我完成循环时,我break
.
然后,我使用 wait
来确保所有这些进程在继续之前终止。
但是,当我检查计数(带jobs -p
)时,我有时会发现:
[10] 9311 Done my_background_function_name $param
如何让wait
仅在所有启动的子进程完全终止且作业列表为空时才继续?
为什么作业有时显示为"已完成",有时不显示?
显然,我对jobs
如何运作的了解是不足的。 :)
谢谢。
在 bash 脚本中,似乎当所有作业都结束时,作业 -p 仍然返回最后一个完成的作业。这在 bash 中对我有用:
while true; do
sleep 5
jobs_running=($(jobs -l | grep Running | awk '{print $2}'))
if [ ${#jobs_running[@]} -eq 0 ]; then
break
fi
echo "Jobs running: ${jobs_running[@]}"
done
使用"等待"命令,您无法判断每个进程何时结束。使用以前的算法,您可以。