在 Debian(以及其它 Linux 发行版)上,僵尸进程(zombie / defunct)增多,通常不是“进程自己变坏了”,而是父进程没有正确回收子进程导致的。下面从原理、常见原因、排查和解决方法四方面说明。
wait() / waitpid() 或父进程退出后由 init/systemd 接管,僵尸才会消失僵尸进程 不占 CPU、不占内存,但占 PID。
如果僵尸太多,可能导致 PID 耗尽(cannot fork)。
这是最常见原因,例如:
fork() 后不 wait()cron、shell 脚本)例子:
fork();
// 子进程 exit
// 父进程什么都不做
→ 子进程变成 zombie
父进程:
→ 没机会执行 wait()
Type=forking例如 shell 脚本:
while true; do
some_command &
done
如果:
wait→ 僵尸堆积
正常情况下:
wait()但如果:
tini 没启用)→ 僵尸无法回收
ps aux | awk '$8 ~ /Z/'
或
ps -ef | grep defunct
ps -eo pid,ppid,stat,comm | awk '$3 ~ /Z/'
重点看 PPID 是谁。
strace -p <PPID>
或
cat /proc/<PPID>/status
SIGCHLDwait() / waitpid()signal(SIGCHLD, SIG_IGN)如果是服务:
systemctl restart <service>
僵尸会随父进程退出被 systemd 回收。
确保:
tini / dumb-initdocker run --initDebian 僵尸进程增多,99% 是因为“父进程没回收子进程”,
不是系统坏了,而是某个服务或程序写错了。
如果你愿意,可以贴一下:
ps -ef | grep defunct
或父进程名,我可以帮你精准判断是哪一个服务的问题。