在 Ubuntu(以及所有类 Unix/Linux 系统)中,僵尸进程(Zombie Process,状态为 Z) 的本质是:
子进程已经结束执行,但其退出状态还没有被父进程回收(wait),内核仍保留其部分进程表信息。
子进程退出 → 父进程未调用 wait() / waitpid() 回收
具体流程是:
fork() 创建子进程wait() / waitpid()fork(),不回收示例(C):
pid_t pid = fork();
if (pid == 0) {
exit(0); // 子进程退出
}
// 父进程没有 wait()
sleep()wait()SIGCHLDSIGCHLDwait()错误示例:
signal(SIGCHLD, SIG_IGN); // 某些情况下仍可能产生僵尸
stop(SIGSTOP)常见于:
& 后台运行子进程但没管理❌ kill -9 对僵尸进程无效
原因:
唯一解决方式:
ps -l # 看 STAT=Z,PPID=父进程ID
kill -9 父进程PID
之后僵尸会被 init / systemd 接管并回收
wait(NULL);
// 或
waitpid(pid, &status, 0);
signal(SIGCHLD, SIG_IGN); // 部分系统可自动回收
systemd 托管服务避免手动 fork 管理子进程
Ubuntu 僵尸进程 = 子进程死了,父进程不管
如果你愿意,我可以:
ps / top 输出init / systemd 如何回收僵尸