温馨提示×

ubuntu 僵尸进程如何检测

小樊
32
2026-08-11 22:45:51
栏目: 智能运维

在 Ubuntu(以及大多数 Linux 系统)中,**僵尸进程(Zombie Process)**是指已经结束运行、但其进程表项尚未被父进程回收的进程。它们不占用 CPU 或内存,但会占用 PID,数量多了可能影响系统。

下面介绍如何检测僵尸进程以及常见排查方法


一、快速检测是否存在僵尸进程

方法 1:使用 top

top

在顶部信息中查看:

Tasks: 123 total,   1 running, 121 sleeping,   0 stopped,   1 zombie

✅ 如果看到 zombie > 0,说明系统中有僵尸进程。


方法 2:使用 ps 命令(最常用)

ps aux | grep 'Z'

或更精确:

ps -eo pid,ppid,stat,cmd | grep Z

示例输出:

 1234  1000 Z    [test] <defunct>

字段说明:

  • Z:进程状态为 Zombie
  • <defunct>:已失效进程
  • PPID:父进程 ID(关键)

方法 3:直接统计僵尸进程数量

ps -eo stat | grep -c Z

输出数字即为僵尸进程数量。


二、查看僵尸进程的父进程(关键)

僵尸进程无法被 kill,只能由父进程回收。

ps -eo pid,ppid,stat,cmd | grep Z

示例:

PID   PPID  STAT CMD
1234  1000  Z    [test] <defunct>

说明:

  • 僵尸进程 PID = 1234
  • 父进程 PID = 1000

再查看父进程:

ps -p 1000 -o pid,ppid,cmd

三、为什么会产生僵尸进程?

常见原因:

  1. 父进程没有调用 wait() / waitpid()
  2. 父进程逻辑错误
  3. 父进程是长期运行的服务(如 Java、Python、C/C++ 程序)
  4. 父进程异常或忽略 SIGCHLD 信号

四、如何处理僵尸进程?

❌ 错误做法

kill -9 僵尸PID

无效,僵尸进程已经死了,只是没被回收。


✅ 正确做法

方法 1:重启或修复父进程

kill -9 父进程PID

父进程退出后,僵尸进程会被 init(或 systemd)接管并回收。

⚠️ 注意:确认父进程可以重启。


方法 2:修复程序代码(开发者)

  • 正确处理子进程退出
  • 捕获 SIGCHLD
  • 调用 wait() / waitpid()

示例(C):

signal(SIGCHLD, SIG_IGN);

或:

while (waitpid(-1, NULL, WNOHANG) > 0);

五、系统层面确认

查看 init / systemd 是否接管僵尸

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

如果父进程是 1,说明父进程已退出,但 systemd 还没回收(通常很快)。


六、总结

目的 命令
是否存在僵尸 top
查看僵尸进程 ps -eo pid,ppid,stat,cmd | grep Z
统计数量 ps -eo stat | grep -c Z
找父进程 ps -p PPID -o cmd
清理方式 重启/修复父进程

如果你愿意,可以把 ps -eo pid,ppid,stat,cmd | grep Z 的输出贴出来,我可以帮你分析具体是哪个程序在产生僵尸进程

0