在 Debian(以及其它 Linux 发行版)里,“僵尸进程(zombie / defunct)”本质上是已经结束、但父进程还没调用 wait() 回收的进程。它们不占 CPU、不占内存,但会占用 PID。下面从发现 → 判断 → 处理三步说明。
ps 查看ps -ef | grep '[d]efunct'
或
ps aux | awk '$8 ~ /Z/'
僵尸进程在 STAT 列通常显示为:
ZZ+Zs示例:
user 1234 1200 0 10:00 ? 00:00:00 [process] <defunct>
top / htoptop
在任务统计区会看到:
Tasks: 210 total, 1 zombie
htop 更直观,僵尸进程通常标记为灰色或 Z。
grep zombies /proc/stat
或直接:
ps -eo stat | grep -c Z
僵尸进程本身已经死掉,关键是找它的父进程。
ps -eo pid,ppid,stat,cmd | grep Z
例如:
PID PPID STAT CMD
1234 1200 Z [xxx] <defunct>
说明:
1234 是僵尸1200 是父进程 PID查看父进程:
ps -p 1200 -o pid,cmd,stat
重启或修复父进程
kill -TERM 1200
# 若无效
kill -KILL 1200
父进程退出后,僵尸会被 init / systemd 接管并回收。
kill -9 1234 # 对僵尸进程无效
僵尸已经“死了”,kill 不起作用。
SIGCHLDwait() / waitpid()signal(SIGCHLD, SIG_IGN);
或waitpid(-1, NULL, WNOHANG);
systemd 管理子进程# 1. 查看僵尸
ps -eo pid,ppid,stat,cmd | grep Z
# 2. 找父进程
ps -p <PPID> -o pid,cmd
# 3. 重启或杀父进程
systemctl restart <service>
# 或
kill -9 <PPID>
如果你愿意,可以把 ps 输出贴出来,我可以帮你精确定位是哪个服务在产生僵尸进程。