在 Ubuntu(以及其它 Linux 系统)中,僵尸进程(Zombie / defunct)本身是不能直接 kill 掉的,因为它已经结束了,只是还在进程表里等着父进程来“收尸”。
下面按原理 + 实操方法说明。
ps -l
或
ps -ef | grep defunct
如果 STAT 列是 Z,就是僵尸进程:
UID PID PPID STAT
root 1234 567 Z
僵尸进程只能由 父进程 通过 wait() 回收。
kill -9 PPID
或
kill -TERM PPID
父进程被杀后,僵尸进程会被
init(PID 1)接管并自动回收。
⚠️ 注意:
systemd、docker、nginx),不要随便杀ps -p PPID
如果是你自己写的服务:
SIGCHLDwait() / waitpid()例如 C / Python / Shell 程序创建子进程后不回收,就会产生僵尸。
如果是某个服务产生的僵尸:
systemctl restart 服务名
例如:
systemctl restart nginx
❌ kill -9 僵尸PID
→ 没用,进程已经死了
❌ kill -9 1
→ 极其危险,系统可能崩溃
查看僵尸数量:
ps aux | awk '$8 ~ /Z/ {print}'
或
top
# 看 Tasks: xxx total, x zombie
ps -ef | grep defunct
# 假设输出
# user 1234 567 0 10:00 ? 00:00:00 [xxx] <defunct>
# 查看父进程
ps -p 567
# 安全处理
kill -9 567
如果你愿意,可以把你的 ps 输出贴出来,我可以帮你判断该杀父进程还是重启服务,避免误操作。