后台进程在其父进程终止时被终止?

后台进程在其父进程终止时被终止?

问题描述:

我有一些代码看起来像这样后台进程在其父进程终止时被终止?

function doTheThing{ 
    # a potentially infinite while loop... 
} 
# other stuff... 
doTheThing & 
trap "kill $!" SIGINT SIGTERM 

奇怪的是,当我CTRL-C出父进程的循环完成之前,我得到这个过程不存在的消息。此外,如果我摆脱陷阱,我不能找到一个ps -aF的过程。看起来后台进程在其父进程终止时被杀死,但我的理解是不应该发生。我只是想确保我能够安全地离开陷阱,并且不会在任何地方留下僵尸进程。

+1

Control-C会杀死整个进程组,而不仅仅是进程。 – Barmar

+1

僵尸进程是一个已经死亡的进程,但其父进程尚未调用“wait”。如果父母被杀,僵尸会被等待它的'init'继承。 – Barmar

+0

所以要清楚,你是说如果我摆脱陷阱,我不会留下任何额外的流程? –

POSIX specification说,当你输入中断字符(通常控制-C)的SIGINT被发送到前台进程组。因此,只要后台进程与调用它的脚本在同一进程组中运行,它就会在脚本进程的同一时间接收到该信号。

Shell通常使用进程组来实现作业控制,并且默认情况下只在交互式shell中启用,而不是在运行脚本的shell中启用。在自己的进程组中没有标准的方法来运行一个函数,但是您可以使用setsid在新的会话中运行它,这比分组进程的分组水平更高。然后它不会收到中断。

尽管如此,您仍然可能想要编写一个trap命令来杀死EXIT上的函数。

doTheThing& 
trap "kill $!" EXIT 

因为退出脚本不会自动终止进程组的其余部分。

+0

幸运的是,这是一个启动长时间运行的开发服务器的脚本。据我所知,脚本结束的唯一方式是sigint sigterm等,或者服务器本身的段错误/致命错误,所以我认为我不需要担心 –