如何杀死一个不重启就无法杀死的进程?

如何杀死一个不重启就无法杀死的进程?

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

执行ps -ef or htop也会挂起当前会话。但是top并且ps -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

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

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

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

尝试cat /proc/16181/syscall查看进程 16181 正在做什么。这可能有效也可能无效,具体取决于您的系统的运行情况。

如果问题是网络文件系统,您可以强制卸载它,或者使其联机。如果问题是内核或硬件错误,您可以采取的措施取决于错误的性质。强烈建议重新启动(并升级到固定内核,或更换损坏的硬件)。

答案2

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

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

答案3

要在 Linux 上查找僵尸进程:

$ ps axo stat,ppid,pid,comm | grep -w 失效

Z 555 10242 该死的僵尸<已不再存在>

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

$ sudo Kill -s SIGCHLD 555

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

$ sudo 杀死 -9 555

一旦其父进程被杀死,僵尸进程将被 init 进程收养,init 进程是 Linux 中所有进程的父进程。 init 进程定期调用wait()以获取任何僵尸进程。

答案4

你只能通过杀死它的父母来杀死僵尸。僵尸进程已释放其所有资源,并正在等待其父进程获取其退出状态。当父进程不执行 await来获取子进程的退出状态时,它就会变成僵尸。当你杀死僵尸的父母时,init获得退出状态,僵尸最终死亡。

相关内容