在 Ubuntu(以及所有 Linux 系统)里,僵尸进程(Zombie / defunct)本身是“已经死掉”的进程,它只占用了进程表中的一个条目,不占用 CPU、内存或文件句柄,所以你不能直接“kill”一个僵尸进程。
正确做法是:杀掉它的父进程,让 init/systemd 来回收它。
ps -l
或
ps -eo pid,ppid,stat,cmd | grep Z
如果 STAT 是 Z 或 Z+,就是僵尸进程。
ps -o pid,ppid,stat,cmd -p <僵尸PID>
例如:
PID PPID STAT CMD
1234 1000 Z [python] <defunct>
说明父进程是 1000
kill -9 <父进程PPID>
或
kill -TERM <父进程PPID>
父进程死后,僵尸进程会被 systemd(PID 1)接管并自动清理。
⚠️ 注意:
nginx、docker、systemd 子进程)如果你是开发者:
SIGCHLDwait() / waitpid()init / systemd(PID 1)一般不会出现长期僵尸,除非 systemd bug
可尝试:
systemctl daemon-reexec
通常是:
解决办法:
# 找到僵尸的父进程
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
然后修复或重启对应服务。
❌ kill -9 僵尸PID → 无效
❌ pkill 僵尸进程 → 无效
❌ 重启机器只是为了清僵尸 → 不推荐(除非别无他法)
僵尸进程杀不掉,只能杀父进程;父进程一死,僵尸自动消失。
如果你愿意,可以把 ps 输出贴出来,我可以帮你判断该杀哪个进程。