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

Background process getting killed when its parent is terminated?

我的代码看起来像这样

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

奇怪的是,当我在循环完成之前按 ctrl-C 退出父进程时,我收到一条消息,指出该进程不存在。此外,如果我摆脱陷阱,我将无法找到带有 ps -aF 的进程。看起来后台进程在其父进程终止时被杀死,但我的理解是这不应该发生。我只是想确保我可以安全地离开陷阱,而不是到处留下僵尸进程。

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

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

不过,您可能仍想编写一个 trap 命令来终止 EXIT 上的函数。

doTheThing&
trap "kill $!" EXIT

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