在 Ubuntu(及其他 Linux 发行版)上,“僵尸进程(Zombie / defunct 进程)”本质上是已经结束运行,但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU/内存,但会占用 PID 表项,数量过多可能有问题。
下面按排查 → 定位 → 处理的顺序说明。
toptop
看这一行:
Tasks: 234 total, 1 running, 230 sleeping, 0 stopped, 3 zombie
如果有 zombie > 0,说明存在僵尸进程。
ps 精确查找ps aux | grep ' Z'
或:
ps -ef | awk '$8 ~ /Z/'
常见显示:
user 12345 6789 0 10:00 ? 00:00:00 [process] <defunct>
Z 状态 = 僵尸PPID(第 3 列)= 父进程 PID僵尸进程不能直接 kill,只能让父进程回收。
查看父进程:
ps -o pid,ppid,stat,cmd -p <僵尸PID>
例如:
PID PPID STAT CMD
12345 6789 Z [myapp] <defunct>
说明 6789 是父进程。
查看父进程信息:
ps -p 6789 -o pid,cmd,stat
如果父进程可以重启:
kill -TERM 6789
# 或
systemctl restart 服务名
父进程退出后,僵尸进程会被 init/systemd(PID 1)接管并回收。
有些程序支持 SIGCHLD:
kill -CHLD 6789
(是否生效取决于程序实现)
kill -9 僵尸PID
无效,因为僵尸进程已经“死”了。
说明系统层面有问题,常见于:
解决方式:
dumb-init 或 tini 作为 PID 1ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print "Zombie:", $1, "Parent:", $2}'
wait() / waitpid()systemd 管理服务tini:ENTRYPOINT ["tini", "--", "你的程序"]
如果你愿意,可以把 ps -ef 或 top 的输出贴出来,我可以帮你具体分析是哪个服务产生了僵尸进程。