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