【问题标题】:How to stop 'uninterruptible' process on Linux?如何停止 Linux 上的“不间断”进程?
【发布时间】:2010-10-20 12:48:38
【问题描述】:

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

top 将进程显示为D,记录为“不间断睡眠”。

strace 什么也没显示。

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

【问题讨论】:

  • 尚未上线 - 据我所知。无论如何感谢您的提示。

标签: linux signals sigabrt kill-process sigkill


【解决方案1】:

简单的回答:你不能。

更长的答案:不间断的睡眠意味着进程不会被信号唤醒。它只能被它正在等待的东西唤醒。当我遇到这种情况时,例如。对于 CD-ROM,我通常使用suspend-to-disk 和resuming 来重置计算机。

【讨论】:

  • 好的,我有不间断的睡眠过程,我怎么能找到它在等待什么?对于什么进程,谁真正阻塞了磁盘 IO?
  • 例如,在文件管理器 (doublecmd) 中,当它等待无响应的 sshfs 挂载并完全杀死 sshfs 时,这是唯一的解决方案,从 D 状态释放文件管理器进程。
  • 这些进程不能立即中断的技术原因是什么?如果内核被修补以使这些进程能够立即被强制终止怎么办?是即使内核也无法阻止它的情况,例如CPU内核是否禁用了中断? (尽管如果有触发 NMI 的方法,例如通过 APIC,即使这也可以解决。)
【解决方案2】:

杀死一个不可中断的进程成功,它只是不会立即这样做。该过程在实际接收到信号之前不会消失。所以仅仅发送一个信号是不足以摆脱进程的,你还得把它从不间断的睡眠中唤醒。

Tanel Poder 写了一篇很棒的 guide to analyse D state processes。这种状态很典型是由不完整的 I/O 引起的,例如网络故障。 slm 已经发布了一些very useful pointers on superuser 如何解除网络 I/O 的阻塞,以及问题本身。

就个人而言,在 VirtualBox 上处理 Windows 时,甚至在使用 wine 时,我经常遇到这个问题,因为 cdrom I/O 永远不会完成(我猜它是某种磁盘存在检查)。 ATA devices can be reset,这可能会解除进程。例如,我正在使用以下小脚本来重置我的两个光驱,从而解除它们阻塞的进程:

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

【讨论】:

  • 不得不使用/sys/block/srX/device/delete 而不仅仅是/sys/block/srX/delete,但这很奏效!
【解决方案3】:

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

进程在退出 D 状态之前不能被杀死。找出它在等待什么并修复它。简单的方法是重新启动。有时删除有问题的磁盘会有所帮助,但这可能相当危险:如果您不知道自己在做什么,则会出现无法修复的灾难性硬件故障(阅读:冒烟)。

【讨论】:

  • 我遇到了这个问题,因为我使用了 fusepy 并在单线程模式下从 FUSE 回调本身访问了挂载点。它现在正在等待自己,我既不能杀死进程本身,也不能杀死任何试图从该挂载点读取的东西......我真的需要为此重新启动吗?
  • 我的意思是,这不是安全漏洞吗?我可以用这个砖任何系统。只需使用创建一个 FUSE 挂载点并将其置于如上所述的不间断睡眠状态,然后在后台启动 ls <mountpoint> 直到达到进程限制。瞧,无法启动新进程。我实际上已经经历过这个过程限制,因为我不小心做了这样的事情:while true; do sleep 1h & done
  • 好的,我可以使用sudo umount -f <mount point> 关闭所有内容而无需重新启动。还有一个FUSE control system) 也可能有效。
【解决方案4】:

我最近在远程服务器上遇到了一个处于D 状态的进程,我想澄清一下,删除该进程需要硬重启或重启。

在用尽所有其他选项之前,请勿尝试软重启。例如,您可以尝试释放进程挂起的任何资源。软重启可能会让您的系统部分关闭并且不再响应 ssh,但不会重启,因为它在试图终止不间断进程时挂起。

【讨论】:

    【解决方案5】:

    正如其他人所说,不可中断进程是卡在无法中断的内核函数中的进程(通常它正在等待一些 I/O 操作)。详细说明见this answer

    除了重新启动计算机之外,我还成功地通过flushing linux VM caches 将一些进程从D 状态中移除:

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

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


    编辑

    根据kernel docsdrop_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。

    【讨论】:

      【解决方案6】:

      这里是新的,没有那么有经验,但是我遇到了同样的问题,当我使用 htop 检查它们的状态时,我可以看到我的进程进入不间断睡眠(D 状态)。 不知为何,

      kill -9 <pid>
      

      为我工作。也许你也可以试试。

      编辑:详细的答案在 ostrokach 那里(我没有看到)。

      【讨论】:

      • 你很幸运。
      猜你喜欢
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 2016-01-02
      • 2011-07-13
      相关资源
      最近更新 更多