在 CentOS(以及所有 Linux 系统)中,**僵尸进程(Zombie Process)**的本质原因是:
子进程已经结束,但父进程没有回收它的退出状态
下面从原理、常见原因、排查和解决方法几个方面说明。
exit() 结束wait() / waitpid() 读取这些信息ps 中显示为:STAT = Z
示例:
ps -ef | grep defunct
父进程:
SIGCHLDwait()例如:
signal(SIGCHLD, SIG_IGN); // 可能导致僵尸
wait()fork() 后忘记 wait()例如:
subprocess.Popen 不 wait()cmd & 但父脚本长期运行✅ 不占 CPU
✅ 不占内存(除 task_struct)
❌ 占用 PID 资源
⚠️ 如果僵尸太多:
ps -ef | grep defunct
或
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
ps -eo stat | grep Z | wc -l
pstree -p | grep -A5 -B5 <僵尸PID>
wait() / waitpid()signal(SIGCHLD, SIG_DFL);
kill -TERM <父进程PID>
僵尸会随父进程退出被 init 回收
kill -9 <僵尸PID>
❌ 僵尸已是死进程,无法被 kill
tinidumb-initCentOS 出现僵尸进程,不是系统问题,而是“父进程没回收子进程”
如果你愿意,可以:
ps 输出我可以帮你精准定位原因。