在 Ubuntu(以及一般 Linux 系统)中,僵尸进程(Zombie / defunct 进程) 的本质是:
子进程已经退出,但其父进程还没有调用
wait()/waitpid()回收它的退出状态,导致进程表项仍然存在。
下面从 如何发现 → 如何定位父进程 → 如何处理 三步说明。
ps 查看ps aux | grep -w Z
或
ps -ef | grep defunct
僵尸进程状态通常显示为:
Z(Zombie)defunct示例:
user 1234 1200 0 10:00 ? 00:00:00 [python] <defunct>
top / htoptop
查看 Tasks: 一行中的 zombie 数量。
htop 更直观:
htop
僵尸进程会显示为灰色或标注 Z。
僵尸进程本身不能直接 kill,关键是找到它的 父进程 PID(PPID)。
ps -eo pid,ppid,stat,cmd | grep -w Z
示例输出:
PID PPID STAT CMD
1234 1200 Z [python] <defunct>
说明:
12341200cat /proc/1234/status | grep PPid
wait() 或 waitpid()查看父进程是什么:
ps -p 1200 -o pid,cmd
如果是某个服务:
systemctl restart 服务名
如果父进程已无用,可以杀掉它(僵尸会被 init 接管并回收):
kill -9 1200
⚠️ 注意:
init(PID 1)❌ kill -9 僵尸PID
→ 对僵尸进程无效(它已经死了)
❌ 僵尸进程会一直占 CPU
→ 不会,只是占进程号
✅ 少量僵尸进程通常无害
→ 大量僵尸才说明程序有问题
如果是你自己的程序产生僵尸:
fork() 后是否 wait()subprocess 时设置 wait() 或 communicate()wait 的后台任务如果你愿意,可以把 ps 输出贴出来,我可以直接帮你分析是哪个进程在“生僵尸”。