在 CentOS(以及所有类 Unix / Linux 系统)中,**僵尸进程(Zombie Process)**的产生原因本质上是 进程退出机制 + 父进程未回收子进程 导致的,并不是 CentOS 特有的“bug”。
下面从原理到常见原因系统说明。
Z(zombie)只要进程:
exit()wait() / waitpid()它就会变成僵尸进程。
在 Linux 中:
子进程退出 → 变成僵尸 → 父进程 wait() 回收 → 真正消失
如果父进程:
wait()子进程就会一直僵尸。
✅ 示例(C):
pid_t pid = fork();
if (pid == 0) {
exit(0); // 子进程退出
}
// 父进程没有 wait()
例如:
fork() 子进程处理请求即使写了 wait(),也可能:
signal(SIGCHLD, SIG_IGN) 不当正常情况下:
signal(SIGCHLD, SIG_IGN);
可以自动回收子进程(Linux 特有行为)
但如果:
wait()就可能导致僵尸。
很多人误以为父进程退出子进程就没事了。
实际上:
wait()⚠️ 但如果:
子进程仍可能僵尸。
父进程:
导致永远不调用 wait()
在多线程程序里:
SIGCHLD 只发给某个线程也可能导致僵尸堆积。
例如:
Type=forking
但:
& 后台进程./xxx &
脚本退出后没 wait
少量僵尸:
大量僵尸:
PID 耗尽)ps -ef | grep defunct
ps -l
top
看 STAT 为 Z
waitpid(-1, NULL, WNOHANG);
或:
signal(SIGCHLD, SIG_IGN);
kill -9 父进程PID
→ 僵尸被 init 接管并回收
systemdTypeCentOS 产生僵尸进程,不是系统问题,而是:子进程退出了,父进程没回收。
如果你愿意,我可以:
只要贴信息就行。