我想问一下当用户注销时,处于'D‘不间断睡眠状态的进程对Linux系统的影响。
用户会话是否可能以注销(而不是关机或重新启动)结束,即使在磁盘休眠中挥之不去的无法杀死的用户进程的情况下,还是系统在尝试注销时会冻结/崩溃?如果尽管进程停滞不前,注销仍然是成功的,那么进程会发生什么情况?它会成为孤儿和被修复吗?它会继续到下一个用户会话吗?另外,如果进程在进入不间断睡眠之前访问共享内存段,那么该共享内存和其他使用它的进程会发生什么情况?他们也会受到影响吗?Linux系统如何处理这种情况?
这种状态很难被故意复制,所以我无法自己想出一种方法来测试它,以便知道答案。
如果之前有人回答了类似的问题,我很抱歉;我尝试过在各种Linux网站和留言板上搜索这些问题的答案,但大多数页面似乎只解释了什么是不间断睡眠,以及如何防止/解决这个问题。我没有找到任何资源来解释当用户会话结束而不重新启动系统时这种进程发生了什么。大多数资源只是重新注释以重新启动系统以摆脱它。
发布于 2017-06-05 14:39:55
一个'D‘进程是无法杀死的,常见的场景是一个过时的NFS文件句柄。如果进程是背靠背的,那么就可以进行注销,但它不会对休眠进程产生影响。
发布于 2017-06-10 06:40:25
首先,谢谢大家的回答!我已经做了一些测试,所以我将尝试回答我自己的问题。
我在systemd (在Ubuntu上)和upstart (在Chromium上)登录时测试了对不中断进程的处理。我发现,导致任意用户进程进入“D”睡眠状态的最简单方法是将其放入冷冻库cgroup子系统并将freezer.status更改为冻结状态。(https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt)之后,我试图通过注销来结束用户会话。据我所知,对于upstart的systemd和Chromium来说,预期的注销行为是,在会话管理器退出之前,所有非根进程都应该被杀死。
注销时发生的情况是,用户会话干净地退出,在Chromium的情况下,加密家庭似乎也没有问题地卸载(我在系统日志中没有发现任何提示卸载失败的东西)。正如预期的那样,冻结的进程在两种情况下都是经过注销的,并且在顶部仍然可见。它没有使用任何资源,在重新登录到帐户后也无法以任何方式访问。重新登录帐户时也没有问题或错误。当我把freezer.status从冷冻变成解冻时,这个过程就消失了。我不确定当进程由于不同的原因进入'D‘状态时,这种行为是否不同,比如被阻止试图访问NFS等等,但我希望结果是相似的。
https://serverfault.com/questions/854026
复制相似问题