如何在Linux上停止“不间断”进程?

我有一个VirtualBox进程挂在我试图杀死(-KILL / -ABORT),但没有成功。 父pid是1(init)。

top显示过程为D ,logging为“不间断睡眠”。

strace什么也没有显示。

我怎样才能摆脱这个? 它阻止我卸载vbox内核驱动程序来加载一个新的。

Solutions Collecting From Web of "如何在Linux上停止“不间断”进程?"

简单的回答:你不能。

较长的回答:不间断的睡眠意味着进程不会被信号唤醒。 它只能被它所等待的东西唤醒。 当我得到这样的情况,例如。 使用CD-ROM时,我通常使用挂起磁盘重新启动计算机。

D状态基本上意味着进程正在等待磁盘I / O或其他不能被中断的块I / O。 有时这意味着内核或设备正在狂热地尝试读取坏块(尤其是光盘)。 有时这意味着还有别的东西。

该进程不能被杀死,直到它离开D状态。 找出它正在等待什么,并解决这个问题。 简单的方法是重新启动。 有时删除有问题的磁盘是有帮助的,但是这可能是相当危险的:如果你不知道自己在做什么,就会造成无法修复的灾难性硬件故障。

杀死一个不可中断的进程成功了,它不会立即做到。 该过程不会消失,直到它实际接收到信号。 所以单独发送信号不足以摆脱这个过程,你还必须把它从不间断的睡眠中唤醒。

Tanel Poder 为分析D状态过程写了一个很好的指南 。 这种状态是非常典型的,是由于I / O不完整造成的,例如网络故障。 slm 在超级用户上发布了一些非常有用的指针,如何对网络I / O进行检测,还讨论了问题本身。

就个人而言,当在VirtualBox上处理Windows时,甚至在使用wine时,我经常遇到这个问题,因为从来没有完成的cdrom I / O(我猜测它是某种类型的光盘存在检查)。 ATA设备可以重置 ,这可能会阻止这个过程。 例如,我正在使用下面的小脚本来重置我的光驱,解除它们所阻塞的进程的干扰:

 echo 1 > /sys/block/sr0/delete echo 1 > /sys/block/sr1/delete echo "- - -" > /sys/class/scsi_host/host7/scan 

我最近在远程服务器上遇到了一个D状态的进程,并想澄清一下,需要重新启动硬盘重新启动电源才能删除进程。

除非用尽所有其他选项,否则不要尝试软重启。 例如,您可以尝试释放该进程挂载的任何资源。 软重启可能会给你一个部分关闭的系统,不再响应ssh,但不会重启,因为它挂起来试图终止不可中断的进程。

正如其他人所说的那样,一个不可中断的进程是一个卡在一个不能被中断的内核函数中的进程(通常是等待一些I / O操作)。 看到这个答案的详细说明。

除了重新启动计算机之外,我还通过刷新linux虚拟机高速缓存来成功地将一些进程从D状态带出:

 kill -9 {process_id} sync echo 3 | sudo tee /proc/sys/vm/drop_caches 

这似乎没有影响系统的稳定性,但我不是一个系统程序员,不知道这可能会有什么意想不到的后果。


编辑

根据内核文档 , drop_caches在开发环境中显得相当安全。

drop_caches

写入这将导致内核删除干净的缓存,以及可回收的板对象,如dentries和inode。 一旦下降,他们的记忆变得自由。

释放页面缓存:

 echo 1 > /proc/sys/vm/drop_caches 

释放可回收的板对象(包括dentries和inode):

 echo 2 > /proc/sys/vm/drop_caches 

要释放平板对象和页面缓存:

 echo 3 > /proc/sys/vm/drop_caches 

这是一个非破坏性的操作,不会释放任何脏物体。 要增加此操作释放的对象数量,用户可以在写入/ proc / sys / vm / drop_caches之前运行“sync”。 这将尽量减少系统上的脏对象的数量,并创建更多的候选人被丢弃。

这个文件不是控制各种内核缓存(inode,dentries,pagecache等)增长的手段。当系统中的其他地方需要内存时,这些对象会被内核自动回收。

使用此文件可能会导致性能问题。 由于它放弃了缓存的对象,因此可能会花费大量的I / O和CPU来重新创建被删除的对象,特别是在被大量使用的情况下。 因此,建议不要在测试或调试环境之外使用。

使用此文件时,您可能会在内核日志中看到信息性消息:

 cat (1234): drop_caches: 3 

这些只是信息。 他们并不是说你的系统有什么问题。 要禁用它们,回声4(位3)到drop_caches。