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

时间:2016-02-11 23:10:29

标签: bash shell sh kill

我的代码看起来像这样

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

奇怪的是,当我在循环完成之前从父进程中ctrl-C时,我得到一条消息,表明进程不存在。此外,如果我摆脱陷阱,我找不到ps -aF的过程。看起来后台进程在其父进程被终止时被杀死,但我的理解是不应该发生。我只是想确保我可以安全地省去陷阱而不是在任何地方留下僵尸进程。

1 个答案:

答案 0 :(得分:2)

POSIX specification表示当您键入中断字符(通常为 Control-C )时,SIGINT将被发送到前台进程组。因此,只要后台进程在与调用它的脚本相同的进程组中运行,它就会在脚本进程的同时收到信号。

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

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

doTheThing&
trap "kill $!" EXIT

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