在 Debian(以及大多数 Linux 系统)中,僵尸进程(Zombie / Z 状态)是指已经结束运行,但父进程还没有回收其资源的进程。下面给你几种常用查看和处理方法。
ps 查看ps aux | grep -w Z
或者更直观:
ps -eo pid,ppid,stat,cmd | grep -w Z
字段说明:
Z:僵尸状态pid:僵尸进程 PIDppid:父进程 PIDcmd:进程命令示例输出:
1234 1000 Z [xxx] <defunct>
toptop
在 top 中:
S 列(状态)Z 表示僵尸进程Tasks: 行(有时会显示 zombie 数量)ps aux | awk '$8 ~ /Z/ { print $2 }' | wc -l
僵尸进程 不占用 CPU、内存,只占用一个 PID 和一个进程表项。
常见原因:
wait() / waitpid()✅ 不能直接 kill 僵尸进程
❌ 下面这个没用:
kill -9 <zombie_pid>
✅ 正确做法:处理它的父进程
ps -eo pid,ppid,stat,cmd | grep -w Z
假设:
1234 1000 Z [xxx] <defunct>
父进程 PID = 1000
ps -p 1000 -o pid,ppid,cmd
systemctl restart 服务名
或
kill -HUP 1000
如果父进程已经不存在,但子进程仍是僵尸:
ps -eo pid,ppid,stat,cmd | grep -w Z
如果 ppid = 1,说明已被 init/systemd 接管,但还没回收(很少见)
如果父进程是系统关键进程(如 systemd),不要强杀,应:
如果你是程序作者:
SIGCHLDwait() / waitpid()double fork 技巧| 操作 | 命令 |
|---|---|
| 查看僵尸 | ps -eo pid,ppid,stat,cmd | grep Z |
| 统计数量 | ps aux | awk '$8 ~ /Z/' |
| kill 僵尸 | ❌ 不行 |
| 处理方法 | ✅ 处理父进程 |
| 最后手段 | 重启服务 / 重启系统 |
如果你愿意,可以把僵尸进程的 ps 输出贴出来,我可以帮你分析具体该处理哪个父进程。