我已经暂停了 50 个进程(这里的背景)使用
kill -STOP
Run Code Online (Sandbox Code Playgroud)
然后那个 shell 窗口崩溃了(可能是 GUI 问题——我刚刚向配置询问了滚动选项的帮助),这似乎导致 50 个进程取消暂停。(我能够再次暂停它们)。
但是为什么 shell 崩溃会导致进程取消暂停?在有人告诉他们取消暂停之前,他们不应该保持暂停吗?
由于 shell 终止,POSIX.1-2008 要求:
如果进程退出导致进程组成为孤立进程,并且新孤立进程组的任何成员停止,则应向新孤立进程组中的每个进程发送 SIGHUP 信号和 SIGCONT 信号.
收到 SIGHUP 的默认操作是终止进程。但是,根据 shell 和进程的启动方式,以及进程本身设置的任何信号处理,进程可能会忽略 SIGHUP。在这种情况下,进程将继续正常执行。
假设是进程组中的进程在作业控制 shell 下运行,将由该 shell 作为一个组操作,而不是由发送直接 SIGSTOP 和 SIGCONT 信号的用户操作。POSIX.1-2008 解释说:
...如果一个进程的终止导致一个进程组成为孤立的,组内的进程将与它们的作业控制外壳断开连接,它不再有关于进程组存在的任何信息。组内停止的进程将永远消失。为了避免这个问题,包含已停止进程的新孤立进程组会被发送一个 SIGHUP 信号和一个 SIGCONT 信号,以表明它们已与它们的会话断开连接。SIGHUP 信号导致进程组成员终止,除非他们正在捕获或忽略 SIGHUP。在大多数情况下,如果进程组的任何成员被停止,则进程组的所有成员都会被停止。
进程可以通过派生和创建自己的会话 ( setsid())来避免这种行为,这样它就不再是启动它的 shell 会话的一部分。这样它就不会受到 shell 内的作业控制、shell 的终止或终端生成的信号的影响。