首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在shell脚本退出时终止后台进程/作业?

如何在shell脚本退出时终止后台进程/作业?
EN

Stack Overflow用户
提问于 2008-12-11 17:33:01
回答 9查看 125.8K关注 0票数 240

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

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-12-11 17:57:33

要清理一些乱七八糟的东西,可以使用trap。它可以提供在特定信号到达时执行的内容的列表:

trap "echo hello" SIGINT

但也可用于在shell退出时执行某些操作:

trap "killall background" EXIT

它是一个内置的,所以help trap会给你信息(与bash一起工作)。如果你只想终止后台作业,你可以这样做

trap 'kill $(jobs -p)' EXIT

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

票数 219
EN

Stack Overflow用户

发布于 2014-03-26 03:04:22

更新:https://stackoverflow.com/a/53714583/302079通过添加退出状态和清理功能改进了这一点。

trap "exit" INT TERM
trap "kill 0" EXIT

为什么要将INTTERM转换为exit?因为两者都应该在不进入无限循环的情况下触发kill 0

为什么要在EXIT上触发kill 0?因为正常的脚本退出也应该触发kill 0

为什么是kill 0?因为嵌套的子壳也需要被杀死。这将拿下the whole process tree

票数 135
EN

Stack Overflow用户

发布于 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

请注意,作业不包括子进程。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/360201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档