他们说我们不能杀死D国的进程,但我刚刚做了,为什么?
ps aux | grep ./a
aa 21431 0.0 0.0 4224 1044 pts/0 S 23:14 0:00 ./a
aa 21818 0.0 0.0 4224 1000 pts/0 S 23:15 0:00 ./a
aa 22160 0.0 0.0 4224 744 pts/0 D 23:15 0:00 ./a
aa 22161 0.0 0.0 4224 744 pts/0 S 23:15 0:00 ./a
aa 22195 0.0 0.0 14224 928 pts/1 S+ 23:15 0:00 grep --color=auto ./a
kill -9 22160
ps aux | grep ./a
www-data 18214 0.0 0.5 830604 10752 ? Sl 06:25 0:09 /usr/sbin/apache2 -k start
aa 21818 0.0 0.0 4224 1000 pts/0 S 23:15 0:00 ./a
aa 22161 0.0 0.0 4224 1008 pts/0 S 23:15 0:00 ./a
aa 22430 0.0 0.0 14224 1016 pts/1 S+ 23:16 0:00 grep --color=auto ./a
答案 0 :(得分:0)
Unix的一些(但不是全部)实现允许SIG状态终止D状态的进程。
D状态睡眠也可能在您输入“杀戮”时结束。命令。 D状态不应该持续很长时间。
无论如何,你不能依赖在D状态的进程中通过任何方式无法重新启动整个计算机。这就是为什么"他们"说出他们说的话。
答案 1 :(得分:0)
您不能杀死处于不间断D状态的进程。有两种可能性。您的过程很容易就不会卡住,它可能只是花了绝大部分时间处于不可中断的D状态。
另一种可能性是您的进程处于 killable 状态。我希望这会显示为D状态,以实现向后兼容。
至少man ps
没有为可杀死状态列出其他字母。 man proc
(/proc/[pid]/stat
)也没有。
TASK_KILLABLE-LWN.net,2008
Unix传统(以及几乎所有应用程序)都认为文件存储写操作不可中断。更改该保证是不安全或不切实际的。
因此,似乎我们永远被偶尔出现的阻碍和永生的过程所困扰。
也许不是。不久前,Matthew Wilcox意识到,如果无论如何该应用程序都将被杀死,那么许多与应用程序错误有关的担忧就不会真正适用。如果注定该系统调用永远不会返回用户空间,则开发人员是否考虑系统调用中断的可能性都没有关系。因此,马修创建了一个新的睡眠状态,称为TASK_KILLABLE;它的行为类似于TASK_UNINTERRUPTIBLE,但致命信号会中断睡眠。
[...]
内核中(实际上是从2.6.26-rc8开始)使用这种新状态的位置的数量非常小-例如,人们不必担心在计数时会用完手指。 NFS客户端代码已转换,这只能是一个受欢迎的发展。但是TASK_KILLABLE的其他用途很少,而在设备驱动程序中则根本没有用,而在设备驱动程序中,这些通常是棘手的地方。
新API可能需要一段时间才能进入内核的广泛使用,特别是当它补充了在大多数情况下都可以正常工作的现有功能时。
我偶然发现TASK_KILLABLE现在也由balance_dirty_pages()使用,至少in Linux v4.19。这是内核功能,当它们填满内核写回缓存时,将在其中处理块。因此,我认为非同步文件系统write()调用现在可以终止。 (也许同步的也是,我没有检查过。)