后台进程在其父进程终止时被终止?
问题描述:
我有一些代码看起来像这样后台进程在其父进程终止时被终止?
function doTheThing{
# a potentially infinite while loop...
}
# other stuff...
doTheThing &
trap "kill $!" SIGINT SIGTERM
奇怪的是,当我CTRL-C出父进程的循环完成之前,我得到这个过程不存在的消息。此外,如果我摆脱陷阱,我不能找到一个ps -aF的过程。看起来后台进程在其父进程终止时被杀死,但我的理解是不应该发生。我只是想确保我能够安全地离开陷阱,并且不会在任何地方留下僵尸进程。
答
的POSIX specification说,当你输入中断字符(通常控制-C)的SIGINT
被发送到前台进程组。因此,只要后台进程与调用它的脚本在同一进程组中运行,它就会在脚本进程的同一时间接收到该信号。
Shell通常使用进程组来实现作业控制,并且默认情况下只在交互式shell中启用,而不是在运行脚本的shell中启用。在自己的进程组中没有标准的方法来运行一个函数,但是您可以使用setsid
在新的会话中运行它,这比分组进程的分组水平更高。然后它不会收到中断。
尽管如此,您仍然可能想要编写一个trap
命令来杀死EXIT
上的函数。
doTheThing&
trap "kill $!" EXIT
因为退出脚本不会自动终止进程组的其余部分。
+0
幸运的是,这是一个启动长时间运行的开发服务器的脚本。据我所知,脚本结束的唯一方式是sigint sigterm等,或者服务器本身的段错误/致命错误,所以我认为我不需要担心 –
Control-C会杀死整个进程组,而不仅仅是进程。 – Barmar
僵尸进程是一个已经死亡的进程,但其父进程尚未调用“wait”。如果父母被杀,僵尸会被等待它的'init'继承。 – Barmar
所以要清楚,你是说如果我摆脱陷阱,我不会留下任何额外的流程? –