有 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
获得退出状态,僵尸最终死亡。