我有一个需要在脚本运行期间在后台运行的命令。意思是直到脚本的其余部分成功运行,遇见Ctrl+c或以其他方式提前终止。
问题是,如果我使用command &
,则即使脚本终止后它仍继续运行,直到启动它的终端终止为止。
有没有办法将后台命令绑定到前台脚本?
这个答案:
要仅
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] 删除。
我来说两句