在 Debian(以及所有 Linux 系统)里,**僵尸进程(Zombie / defunct 进程)**的本质是:
子进程已经退出,但父进程还没有“收尸”(调用 wait / waitpid)
下面从“怎么来的”角度系统说明。
当一个进程:
exit() 或从 main 返回此时进程状态变为:
Z (zombie)
只有当父进程调用 wait() / waitpid() 后,僵尸才会被彻底清除。
pid_t pid = fork();
if (pid == 0) {
exit(0); // 子进程退出
}
// 父进程啥也不做
→ 子进程立刻变僵尸
while (1) {
do_work();
// 忘了 wait
}
即使子进程退出,父进程一直不回收
有些程序错误地:
signal(SIGCHLD, SIG_IGN);
会导致:
⚠️ 正确做法是用 sigaction + SA_NOCLDWAIT(谨慎使用)
SIGSTOP→ 子进程退出后无人回收
常见服务:
例如:
正常情况下:
但如果:
→ 僵尸不会被回收
ps -l
或
ps aux | grep ' Z '
示例:
USER PID STAT TIME COMMAND
root 1234 Z 0:00 [sh] <defunct>
STAT = Z 就是僵尸
✅ 不占 CPU
✅ 不占内存
❌ 占 PID(有限资源)
后果:
wait() / waitpid()sigaction(SIGCHLD)kill -9 僵尸PID # 无效
僵尸已经死了,杀不掉
kill -TERM 父PID
Debian 的僵尸进程,不是“死不了”,而是“父进程不管”。
如果你愿意,我可以: