我正在寻找一种方法来清理我的顶级脚本退出时的混乱。
尤其是如果我想使用set -e,我希望后台进程在脚本退出时会死掉。
发布于 2008-12-11 17:57:33
要清理一些乱七八糟的东西,可以使用trap。它可以提供在特定信号到达时执行的内容的列表:
trap "echo hello" SIGINT但也可用于在shell退出时执行某些操作:
trap "killall background" EXIT它是一个内置的,所以help trap会给你信息(与bash一起工作)。如果你只想终止后台作业,你可以这样做
trap 'kill $(jobs -p)' EXIT注意使用单个',以防止外壳立即替换$()。
发布于 2014-03-26 03:04:22
更新:https://stackoverflow.com/a/53714583/302079通过添加退出状态和清理功能改进了这一点。
trap "exit" INT TERM
trap "kill 0" EXIT为什么要将INT和TERM转换为exit?因为两者都应该在不进入无限循环的情况下触发kill 0。
为什么要在EXIT上触发kill 0?因为正常的脚本退出也应该触发kill 0。
为什么是kill 0?因为嵌套的子壳也需要被杀死。这将拿下the whole process tree。
发布于 2015-09-15 05:01:42
一个在Linux,BSD和MacOS X下工作的很好的版本。首先尝试发送send,如果没有成功,在10秒后终止进程。
KillJobs() {
for job in $(jobs -p); do
kill -s SIGTERM $job > /dev/null 2>&1 || (sleep 10 && kill -9 $job > /dev/null 2>&1 &)
done
}
TrapQuit() {
# Whatever you need to clean here
KillJobs
}
trap TrapQuit EXIT请注意,作业不包括子进程。
https://stackoverflow.com/questions/360201
复制相似问题