为什么我能在debian中杀死一个状态D的进程?

时间:2017-09-28 15:25:24

标签: c linux process debian

他们说我们不能杀死D国的进程,但我刚刚做了,为什么?

picture here

 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

2 个答案:

答案 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()调用现在可以终止。 (也许同步的也是,我没有检查过。)