我正在寻找一种方法,可以在我的顶级脚本退出时清理混乱。尤其是如果我想使用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 ',以防止外壳$()立即替换。

天涯尽头无女友
TA贡献1831条经验 获得超9个赞
这对我有用(感谢评论者的改进):
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
kill -- -$$将SIGTERM发送给整个进程组,从而也杀死后代。
EXIT使用时指定信号很有用set -e(此处有更多详细信息)。

繁华开满天机
TA贡献1816条经验 获得超4个赞
陷阱'kill $ {jobs -p)'退出
我只对Johannes的答案做些微改动,并使用jobs -pr限制kill到正在运行的进程,并向列表中添加一些其他信号:
trap 'kill $(jobs -pr)' SIGINT SIGTERM EXIT
- 4 回答
- 0 关注
- 1509 浏览
添加回答
举报
0/150
提交
取消