在 Ubuntu(以及其它 Linux 发行版)上,“僵尸进程(Zombie / defunct 进程)”是指已经结束运行,但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU、内存,但会占用 PID 表项。
下面是定位僵尸进程的常用方法。
psps aux | grep Z
或
ps -ef | grep defunct
僵尸进程在 STAT 列会显示为:
Z 或 Z+<defunct>示例:
user 12345 0.0 0.0 0 0 ? Z 10:00 0:00 [python] <defunct>
top / htoptop
在任务统计区会看到:
Tasks: 210 total, 1 zombie
htop 更直观:
htop
僵尸进程会显示为灰色或标记为 Z
/proc 看ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
僵尸进程本身无法被 kill,必须处理它的父进程。
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
例如:
PID PPID STAT CMD
12345 1000 Z [python] <defunct>
说明 PPID = 1000 的进程没有回收子进程。
ps -p 1000 -o pid,ppid,cmd,stat
常见原因:
wait()ps -eo stat | grep -c Z
或
cat /proc/loadavg
(僵尸进程不计入 load)
kill -TERM 1000
或
systemctl restart 服务名
kill -9 僵尸PID
⚠️ 僵尸进程已经“死”了,不能被 kill
wait() / waitpid()signal(SIGCHLD, SIG_IGN)fork() + exec() 时注意回收如果你愿意,可以把:
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
的输出贴出来,我可以帮你具体分析是哪个服务或程序产生了僵尸进程。