猿问

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

我正在寻找一种方法,可以在我的顶级脚本退出时清理混乱。

尤其是如果我想使用set -e,希望脚本退出时后台进程会死掉。


临摹微笑
浏览 1486回答 4
4回答

FFIVE

可以清理一些乱七八糟的东西trap。它可以提供在特定信号到达时执行的工作清单:trap "echo hello" SIGINT但如果shell退出,也可以用来执行某些操作:trap "killall background" EXIT它是内置的,因此help trap将为您提供信息(适用于bash)。如果您只想杀死后台工作,则可以trap 'kill $(jobs -p)' EXIT注意使用single ',以防止外壳$()立即替换。

天涯尽头无女友

这对我有用(感谢评论者的改进):trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXITkill -- -$$将SIGTERM发送给整个进程组,从而也杀死后代。EXIT使用时指定信号很有用set -e(此处有更多详细信息)。

繁华开满天机

陷阱'kill $ {jobs -p)'退出我只对Johannes的答案做些微改动,并使用jobs -pr限制kill到正在运行的进程,并向列表中添加一些其他信号:trap 'kill $(jobs -pr)' SIGINT SIGTERM EXIT
随时随地看视频慕课网APP
我要回答