使用`&`在后台启动命令,并使其在脚本中消失

274

我有一个需要在脚本运行期间在后台运行的命令。意思是直到脚本的其余部分成功运行,遇见Ctrl+c或以其他方式提前终止。

问题是,如果我使用command &,则即使脚本终止后它仍继续运行,直到启动它的终端终止为止。

有没有办法将后台命令绑定到前台脚本?

卡米尔·马乔洛夫斯基(Kamil Maciorowski)

这个答案

要仅kill处理由管理的所有后台作业bash,请执行

kill $(jobs -p)

一种基本的方法是将这一行放在主脚本的末尾,尽管该脚本可能永远无法到达它。更高级的方法是在主脚本中创建一个陷阱:

trap 'kill $(jobs -p) 2>/dev/null' EXIT

在开始后台作业之前定义陷阱。kill即使主脚本过早终止(除非强制终止,例如使用SIGKILL),命令仍将运行。

但是请记住,您的工作可能会忽略从kill陷阱中获取的SIGTERM

如果只想杀死特定的后台作业(而不是所有后台作业),则将其PID存储在变量中,并在陷阱中使用该变量:

trap 'kill "$jpid" 2>/dev/null' EXIT

…

your_job &
jpid="$!"

…

我认为这是有缺陷的:如果主外壳在两者之间终止your_job &jpid="$!"则陷阱将无法$jpid使用。。中没有这样的缺陷kill $(jobs -p)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章