在 Debian(以及所有 Linux 发行版)里,僵尸进程(zombie / defunct)不消失,通常不是系统 bug,而是父进程没有正确回收子进程导致的。下面分点说明原因和解决办法。
wait() / waitpid()Z(zombie)僵尸进程不占 CPU、不占内存,只占一个 PID 表项
父进程:
wait()SIGCHLD)fork() 模型示例错误:
signal(SIGCHLD, SIG_IGN); // 错误:可能导致不回收
父进程:
结果:
正常情况下:
wait()但如果:
僵尸可能滞留
如果:
cat /proc/sys/kernel/pid_max
接近上限,僵尸也可能异常存在
ps aux | grep ' Z'
或:
top
# 看 Tasks: x zombie
查看父进程:
ps -o pid,ppid,stat,cmd -p <僵尸PID>
修复父进程代码
SIGCHLDwaitpid(-1, &status, WNOHANG)示例:
while (waitpid(-1, NULL, WNOHANG) > 0);
如果父进程不重要:
kill -TERM <父进程PID>
父进程死后:
⚠️ 不能直接 kill 僵尸进程
kill -9 <僵尸PID> # 无效
常见于:
tini / dumb-init解决:
ENTRYPOINT ["tini", "--", "your_app"]
Debian 僵尸进程不消失,是因为父进程没有回收它;杀父进程或用 init 回收是唯一有效手段。
如果你愿意,可以把:
ps 输出发出来,我可以帮你具体判断。