我有一个 VirtualBox 进程,我试图杀死(KILL
/ ABORT
)但没有成功。父 pid 为 1 (init)。
top
显示了D
记录为“不间断睡眠”的过程。
strace
什么都不显示。
我怎样才能摆脱这个?它阻止我卸载 VirtualBox 内核驱动程序以加载更新的驱动程序。
我有一个 VirtualBox 进程,我试图杀死(KILL
/ ABORT
)但没有成功。父 pid 为 1 (init)。
top
显示了D
记录为“不间断睡眠”的过程。
strace
什么都不显示。
我怎样才能摆脱这个?它阻止我卸载 VirtualBox 内核驱动程序以加载更新的驱动程序。
简单的答案:你不能。
更长的答案:不间断的睡眠意味着进程不会被信号唤醒。它只能被它正在等待的东西唤醒。当我遇到这种情况时,例如。对于 CD-ROM,我通常使用suspend-to-disk 和恢复来重置计算机。
杀死一个不间断的进程是成功的,它只是不会立即这样做。该过程在实际接收到信号之前不会消失。所以仅仅发送一个信号是不足以摆脱进程的,你还必须把它从不间断的睡眠中唤醒。
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状态基本上意味着进程正在等待磁盘I/O,或者其他不能中断的块I/O。有时这意味着内核或设备正在疯狂地尝试读取坏块(尤其是从光盘中)。有时这意味着还有别的东西。
进程在退出 D 状态之前不能被杀死。找出它在等待什么并修复它。简单的方法是重新启动。有时删除有问题的磁盘会有所帮助,但这可能相当危险:如果您不知道自己在做什么,则无法修复的灾难性硬件故障(阅读:冒烟)。
我最近在远程服务器上遇到了一个处于D
状态的进程,我想澄清一下,需要硬重启或重启才能删除该进程。
在用尽所有其他选项之前,请勿尝试软重启。例如,您可以尝试释放进程挂起的任何资源。软重启可能会让您的系统部分关闭并且不再响应 ssh,但不会重启,因为它在试图终止不间断进程时挂起。
正如其他人所说,不可中断进程是卡在无法中断的内核函数中的进程(通常它正在等待一些 I/O 操作)。有关详细说明,请参阅此答案。
除了重新启动计算机之外,我还通过刷新 linux VM 缓存D
成功地使一些进程脱离了状态:
kill -9 {process_id}
sync
echo 3 | sudo tee /proc/sys/vm/drop_caches
这似乎并没有影响系统稳定性,但我不是系统程序员,不确定这可能会产生什么意想不到的后果。
编辑:
根据内核文档,drop_caches
在开发环境中似乎相当安全。
drop_caches
写入这将导致内核丢弃干净的缓存,以及可回收的slab对象,如dentries和inode。一旦放下,他们的记忆就会自由。
释放页面缓存:
echo 1 > /proc/sys/vm/drop_caches
释放可回收的slab对象(包括dentries和inode):
echo 2 > /proc/sys/vm/drop_caches
释放slab对象和页面缓存:
echo 3 > /proc/sys/vm/drop_caches
这是非破坏性操作,不会释放任何脏对象。为了增加此操作释放的对象数量,用户可以在写入 /proc/sys/vm/drop_caches 之前运行“同步”。这将最大限度地减少系统上脏对象的数量并创建更多要删除的候选对象。
该文件不是控制各种内核缓存(inode、dentries、pagecache 等)增长的手段,当系统其他地方需要内存时,内核会自动回收这些对象。
使用此文件可能会导致性能问题。由于它会丢弃缓存的对象,因此重新创建丢弃的对象可能会花费大量的 I/O 和 CPU,尤其是在它们被大量使用的情况下。因此,不建议在测试或调试环境之外使用。
使用此文件时,您可能会在内核日志中看到信息性消息:
cat (1234): drop_caches: 3
这些仅供参考。它们并不意味着您的系统有任何问题。要禁用它们,请将 4(位 3)回显到 drop_caches。
这里是新的,没有那么有经验,但是我遇到了同样的问题,当我使用 htop 检查它们的状态时,我可以看到我的进程进入不间断睡眠(D 状态)。由于某些原因,
kill -9 <pid>
为我工作。也许你可以试试同样的。
编辑:详细的答案在 ostrokach 那里(我没有看到)。