【发布时间】:2016-06-11 01:12:38
【问题描述】:
简短版:我的 bash 脚本有一个函数。
然后,此函数会在后台(使用&)启动另一个函数的多个实例(最多 10 个)。
我在一个 do 循环中使用jobs -p | wc -w 计算仍然活跃的数量。当我完成循环后,我break。
然后我使用wait 确保所有这些进程在继续之前终止。
但是,当我检查计数时(使用jobs -p),我有时会发现:
[10] 9311 Done my_background_function_name $param
我怎样才能让wait 仅在所有启动的子进程完全终止并且作业列表为空时继续?
为什么工作有时会显示“完成”,有时却没有?
显然,我对jobs 工作原理的了解不足。 :)
谢谢。
【问题讨论】:
-
如果你要等,为什么不检查
jobs -p为什么不直接跳到wait,因为它会等待所有的孩子? -
虽然不一样,但我一直对作业和流程之间的关系感到困惑(here)。它们肯定是不同的,因此将您对它们的想法过多地混合在一起并不一定安全,即使流程消失了,工作也可以继续,尽管这不是您在这里遇到的问题,我只是强调它们不可互换
-
jobs -p构成屏幕进度显示的一部分,让用户知道该后台功能的多少副本仍处于活动状态。在wait之后,它再次运行以确保进度现在显示为“0”。但有时它不会。我不知道为什么。也许我应该解析jobs输出并仅计算列为“正在运行”的作业数? -
@EricRenouf - 是的,我很困惑。我通常使用 PID,但看起来
jobs -p可能是一个更好的解决方案。现在我不确定。 :) -
你能发布更多你的代码吗?它可能会更容易解开
标签: bash shell background wait jobs