为了账号安全,请及时绑定邮箱和手机立即绑定

当我的Shell脚本退出时,如何杀死后台进程/作业?

当我的Shell脚本退出时,如何杀死后台进程/作业?

临摹微笑 2019-10-05 13:21:50
我正在寻找一种方法,可以在我的顶级脚本退出时清理混乱。尤其是如果我想使用set -e,希望脚本退出时后台进程会死掉。
查看完整描述

4 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

可以清理一些乱七八糟的东西trap。它可以提供在特定信号到达时执行的工作清单:


trap "echo hello" SIGINT

但如果shell退出,也可以用来执行某些操作:


trap "killall background" EXIT

它是内置的,因此help trap将为您提供信息(适用于bash)。如果您只想杀死后台工作,则可以


trap 'kill $(jobs -p)' EXIT

注意使用single ',以防止外壳$()立即替换。


查看完整回答
反对 回复 2019-10-05
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

这对我有用(感谢评论者的改进):


trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT

kill -- -$$将SIGTERM发送给整个进程组,从而也杀死后代。


EXIT使用时指定信号很有用set -e(此处有更多详细信息)。


查看完整回答
反对 回复 2019-10-05
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

陷阱'kill $ {jobs -p)'退出


我只对Johannes的答案做些微改动,并使用jobs -pr限制kill到正在运行的进程,并向列表中添加一些其他信号:


trap 'kill $(jobs -pr)' SIGINT SIGTERM EXIT


查看完整回答
反对 回复 2019-10-05
  • 4 回答
  • 0 关注
  • 1484 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信