在用户注销时如何处理不间断睡眠中的进程?

我想问一下当用户注销时Linux进程中“D”不可中断睡眠状态的进程的影响。

即使在磁盘睡眠中持续存在的不可用的用户进程的情况下,甚至有可能通过注销(不closures或重新启动)来结束用户会话,或者系统在注销时尝试冻结/崩溃? 如果注销过程成功,注销成功,过程会发生什么? 它是否成为孤儿和重新安置? 它会继续到下一个用户会话吗? 另外,如果进程在进入不可中断睡眠之前正在访问共享内存段,那么共享内存和使用它的其他进程会发生什么情况? 他们是否也受到影响? Linux系统如何处理这种情况?

这个状态很难有目的地重现,所以我不能想出一个方法来自己testing,以便知道答案。

如果在某个地方出现过类似的问题,我很抱歉。 我已经尝试过search各种Linux网站和留言板来解答这些问题,但是大多数网页似乎只是解释了不间断睡眠以及如何防止/解决问题。 我没有设法find任何资源来解释用户会话结束而不重新启动系统时发生的这种过程。 大多数来源只是build议重新启动系统来摆脱它。

一个'D'进程是不可驱动的,常见的情况是一个陈旧的NFS文件句柄。 如果这个过程是黑色的,那么注销可能会发生,但它不会影响睡眠过程。

首先,感谢大家的答案! 我做了一些testing,所以我会试着回答我自己的问题。

我testing了systemd(在Ubuntu上)和upstart(在Chromium OS上)注销时不间断进程的处理。 我发现导致任意用户进程进入“D”睡眠状态的最简单的方法是将其放入冷冻机cgroup子系统并将冷冻机状态更改为冷冻。 ( https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt )在此之后,我尝试通过注销结束用户会话。 据我所知,注销systemd和Chromium操作系统风格的暴发户期望的行为是所有的非根进程应该在会话pipe理器退出之前被终止。

注销时发生的事情是用户会话干净地退出,在Chromium操作系统的情况下,cryptohome似乎也没有卸载没有问题(我还没有发现系统日志中的任何暗示卸载失败)。 正如预期的那样,冻结过程在两种情况下都能够幸存下来,并且仍然在顶部可见。 它没有使用任何资源,并在重新login帐户后无法访问。 记账时也没有问题或错误。 只要我把冷冻库的状态从冷冻变成冷冻,这个过程就消失了。 我不知道这个行为是不是因为不同的原因进入“D”状态,比如被阻塞试图访问NFS等,但我期望结果是相似的。