在 Debian(及其他 Linux 发行版)中,“僵尸进程(Zombie / defunct)”是指已经结束运行,但父进程还没调用 wait() 回收其退出状态的进程。它们不占 CPU、不占内存,但会占用 PID。
下面按定位 → 分析 → 处理来讲。
ps 查看ps -ef | grep defunct
或
ps aux | awk '$8 ~ /Z/'
僵尸进程在 STAT 列通常显示为:
Z
Zs
Z+
示例:
user 1234 1200 0 10:00 ? 00:00:00 [python] <defunct>
1234:僵尸 PID1200:父进程 PID(关键)top / htoptop
查看:
Tasks: 210 total, 1 zombie
htop
僵尸进程会显示为灰色或 <defunct>
cat /proc/stat | grep processes
或直接:
ps -eo stat | grep -c Z
ps -o ppid= -p <僵尸PID>
或更直观:
pstree -p | grep -i defunct
ps -p <父PID> -o pid,ppid,cmd,stat
常见原因:
wait())⚠️ 僵尸进程不能直接 kill
kill -TERM <父PID>
# 或
systemctl restart <服务名>
父进程退出后,僵尸会被 init / systemd 回收。
kill -CHLD <父PID>
仅当父进程正确处理 SIGCHLD 时有效。
kill -9 <僵尸PID> # 无效
僵尸已经“死”了,只是没被收尸。
wait() / waitpid()signal(SIGCHLD, SIG_IGN)(部分场景)systemd 管理子进程ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/ {print}'
如果你愿意,可以贴一段:
ps -ef | grep defunct
或
pstree -p
我可以帮你具体分析是哪个服务导致的。