【问题标题】:Bash: check job is finishedBash:检查工作是否完成
【发布时间】:2020-11-20 10:54:43
【问题描述】:

理论问题。有人可以解释一下为什么jobs 已经完成后继续返回Done 吗?

root@test:~# cat 1.sh
#!/bin/bash

sleep 5 &
while true; do
  echo $(jobs) && sleep 1
done

root@test:~# ./1.sh
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Running sleep 5 &
[1]+ Done sleep 5
[1]+ Done sleep 5
[1]+ Done sleep 5
[1]+ Done sleep 5
^C

GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)

【问题讨论】:

  • 因为while true 永远不会退出,除非您在工作完成或达到某种超时限制时自己exit
  • 问题不在于退出脚本,而在于$(jobs)一直返回Done

标签: bash jobs


【解决方案1】:

由于在脚本中禁用了作业控制,因此 bash 会忽略信号 SIGCHLD,并且不会收到(也不想)关于终止后台进程的通知。

因为jobs 在子shell 中执行,所以父shell 环境不知道最后一个jobs 已经检查了子shell 的退出状态并且子shell 终止了。正因为如此,每次创建一个新的 subshel​​l 时,新环境都不知道该消息已被打印,因此它会打印另一个。

【讨论】:

  • 谢谢。因此,如果您说子外壳不能将更改传递给其父外壳,那么子外壳如何区分“运行”状态和“完成”状态?为什么$(jobs) 一直没有返回“[1]+ Running sleep 5 &”?
  • how does the subshell distinguish "Running" state from "Done"? ?它只是检查 pid 是否正在运行。或者,它打开了一个 pidfd,因此它检查 pidfd 是否正在运行,无论哪种方式都相同。
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多