【问题标题】:BASH - After 'wait', why does 'jobs -p' sometimes show 'Done' for a background process?BASH - 在“等待”之后,为什么“jobs -p”有时会显示后台进程的“完成”?
【发布时间】: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


【解决方案1】:

在 bash 脚本中,似乎当所有作业都结束时,jobs -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

使用“等待”命令,您无法判断每个进程何时结束。 用之前的算法就可以了。

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 2018-01-12
    • 1970-01-01
    • 2011-10-07
    • 2018-01-30
    • 2010-11-11
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多