在 Debian(以及大多数 Linux 发行版)中,**僵尸进程(Zombie Process,状态为 Z)**的本质是:
子进程已经退出,但其父进程还没有调用
wait()/waitpid()来回收它的退出状态。
下面按常见原因分类说明:
SIGCHLD很多程序会写:
signal(SIGCHLD, SIG_IGN);
这会导致系统自动回收子进程,但某些旧实现或特定场景下仍可能留下僵尸。
或者父进程:
sa_flags = SA_RESTART | SA_NOCLDWAITwait()fork() 不 wait()典型错误示例:
if (fork() == 0) {
exit(0);
}
// 父进程什么都不做
子进程退出后无人回收 → 僵尸。
wait()例如:
sleep() / 死循环wait() 使用不当wait()fork() 后主线程没回收pthread + fork 混用导致资源状态异常kill -9init/systemd 接管SIGCHLD 但没 wait()system() / popen() 后未关闭Type=forking 但程序未正确 daemonize在 Docker 中:
inittini / dumb-initwait()例如:
subprocess即使逻辑正确,也可能出现瞬时僵尸堆积。
ps -ef | grep defunct
ps -o pid,ppid,stat,cmd -C xxx
cat /proc/<pid>/status
僵尸无法被 kill,只能:
wait()如果你愿意,可以:
ps 输出