如何杀死无法重启的进程?


11

有5个进程不能被杀死kill -9 $PID,执行cat /proc/$PID/cmdline将挂起当前会话。也许它们是僵尸进程。

执行ps -ef or htop也会挂起当前会话。但是topps -e并且工作正常。

因此,似乎文件系统没有响应有两个问题。

这是一台运行虚拟机的生产机,因此无法选择重新启动。

以下进程ID无效:16181 16765 5985 7427 7547

这些过程的父级是init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

qemu进程之一不起作用

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)

1
僵尸进程应该不会造成问题。如果僵尸进程的数量太大,超过了服务器上的进程限制,则将导致问题。
拉扎

@Salton:我们不能使用ps -ef和htop,所以我们遇到了一些问题,也许我们看到的不是僵尸进程?
Sam Stoelinga

1
您可以尝试通过跟踪/usr/bin/strace ps -ef来了解您的确切ps -ef位置。
拉扎

2
您如何确定这些是僵尸?这看起来像是挂起的进程。不ps -el工作,哪些状态是这些过程吗?
尼尔斯

最终,由于问题越来越严重,客户端仍然决定重新启动计算机。感谢所有的投入。从僵尸和不可中断的过程中学到很多东西。
山姆·斯托林加

Answers:


22

你没有僵尸。cat /proc/$PID/cmdline僵尸不会有任何问题。如果kill -9没有杀死程序,则表示程序正在执行一些不间断的I / O操作。这通常表示以下三件事之一:

  • 没有响应的网络文件系统;
  • 内核错误;
  • 硬件错误。

诸如此类的实用程序ps如果尝试读取某些信息(例如,由于上述原因之一,内核未提供的进程可执行路径),则可能会挂起。

尝试cat /proc/16181/syscall查看16181在做什么。根据系统的运行距离,此方法可能有效也可能无效。

如果问题是网络文件系统,则可以强制卸载它或使其联机。如果问题是内核或硬件错误,则可以执行的操作取决于错误的性质。强烈建议重新引导(并升级到固定内核,或更换损坏的硬件)。


猫从不回应。我不认为这是一个错误。我认为这是一个“功能”。
猫头鹰

7

其他答案假设这些是僵尸进程。僵尸进程是已完成运行但仍在进程表中的进程,以防父母希望知道退出状态。这些是正常的,并且init会自动清理分配给它的僵尸进程。

僵尸进程应该永远不会导致任何挂起,因此听起来这可能不是您的问题。如果是系统调用或驱动程序挂起,则该过程可能处于不间断状态。有一个很好的解释在这里


太多的僵尸进程可能会阻止fork成功(当nrpoc达到困难时),因为它们仍然占据进程表中的空间。
dhchdhd

2

在Linux上查找僵尸进程:

$ ps axo统计信息,ppid,pid,comm | grep -w已停用

Z 555 10242该死的僵尸<已停产>

首先,您可以尝试使用kill命令将SIGCHLD信号发送到僵尸的父进程。请注意,以上命令为您提供了每个僵尸的PPID(父进程的PID)。在我们的示例中,僵尸的PPID为555

$ sudo kill -s SIGCHLD 555

如果僵尸进程仍然没有消失,您可以杀死僵尸的父进程(例如555)。

$ sudo kill -9555

一旦其父进程被杀死,僵尸将被init进程采用,该进程是Linux中所有进程的父级。初始化进程会定期调用wait()以获取任何僵尸进程。


这是真正的答案。杀死父母工作,谢谢。
安德鲁

1

您只能通过杀死僵尸来杀死僵尸。僵尸进程已释放其所有资源,并正在等待其父进程获取退出状态。当父母不执行wait从孩子那里获得退出状态的行为时,它将成为僵尸。当您杀死僵尸的父母时,init拾起退出状态,僵尸最终死亡。


所以你要我杀死init?目前尚不清楚,从问题不好意思呵呵,但父母似乎是init :(我编辑的问题。
山姆Stoelinga

4
不,我们希望您不要试图杀死僵尸。您无法杀死僵尸。该常见问题与Unix一样古老。
2013年

@tripleee:是的,这就是我的理解。也许我所拥有的不是僵尸。htop无法正常工作,而cat / proc / $ pid / cmdline或ls / proc / $ pid /也无法正常工作。通常对于僵尸来说这不会发生,这就是为什么我在这里问这个问题,这不是imo的常见问题。我检查了几个答案,所有答案都告诉您要杀死父母,就我而言,这是init或重新启动。
Sam Stoelinga

1
“杀死父母”是获得普通僵尸的方式。你不能杀人init。如果在下方放置了僵尸init,则无法杀死它。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.