在 Ubuntu(以及大多数 Linux 系统)中,**僵尸进程(Zombie Process)**是指已经结束运行、但其进程表项尚未被父进程回收的进程。它们不占用 CPU 或内存,但会占用 PID,数量多了可能影响系统。
下面介绍如何检测僵尸进程以及常见排查方法。
toptop
在顶部信息中查看:
Tasks: 123 total, 1 running, 121 sleeping, 0 stopped, 1 zombie
✅ 如果看到 zombie > 0,说明系统中有僵尸进程。
ps 命令(最常用)ps aux | grep 'Z'
或更精确:
ps -eo pid,ppid,stat,cmd | grep Z
示例输出:
1234 1000 Z [test] <defunct>
字段说明:
Z:进程状态为 Zombie<defunct>:已失效进程PPID:父进程 ID(关键)ps -eo stat | grep -c Z
输出数字即为僵尸进程数量。
僵尸进程无法被 kill,只能由父进程回收。
ps -eo pid,ppid,stat,cmd | grep Z
示例:
PID PPID STAT CMD
1234 1000 Z [test] <defunct>
说明:
再查看父进程:
ps -p 1000 -o pid,ppid,cmd
常见原因:
wait() / waitpid()kill -9 僵尸PID
❌ 无效,僵尸进程已经死了,只是没被回收。
kill -9 父进程PID
父进程退出后,僵尸进程会被 init(或 systemd)接管并回收。
⚠️ 注意:确认父进程可以重启。
SIGCHLDwait() / waitpid()示例(C):
signal(SIGCHLD, SIG_IGN);
或:
while (waitpid(-1, NULL, WNOHANG) > 0);
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 的输出贴出来,我可以帮你分析具体是哪个程序在产生僵尸进程。