在 **CentOS(以及所有 Linux 系统)**中,**僵尸进程(Zombie Process)**出现的原因本质上只有一个:
子进程已经结束,但父进程还没有调用
wait()/waitpid()回收它的状态信息。
下面从原理、常见原因、如何排查和处理几个方面说明。
Z(Zombie)ps -ef | grep Z
或
ps aux | awk '$8=="Z"'
子进程退出后,父进程没有回收它
Linux 内核在子进程退出时:
wait() 获取退出状态pid_t pid = fork();
if (pid == 0) {
exit(0); // 子进程退出
}
// 父进程没有 wait()
while (1);
✅ 正确做法:
wait(NULL);
或
signal(SIGCHLD, SIG_IGN);
SIGCHLD 信号D 状态(不可中断睡眠)SIGSTOP 暂停以下服务在 CentOS 中容易出现僵尸:
& 启动子进程但不 waitcrondhttpdnginx + fastcgisystemd 收养systemd 没有正确处理(少见)✅ 不占 CPU、内存 ❌ 会占用 PID
如果僵尸进程太多:
fork: retry: No child processesps -eo pid,ppid,stat,cmd | grep ' Z'
ps -o pid,ppid,stat,cmd -p <僵尸PID>
ps -p <PPID> -o pid,stat,cmd
kill -9 僵尸PID # 无效
因为僵尸进程已经死了,只是“尸体”还在进程表里
kill -HUP 父进程PID
或
systemctl restart 服务名
systemd 接管systemd 会自动 wait()✅ 僵尸会消失
✅ 父进程必须:
wait() / waitpid()SIGCHLDsignal(SIGCHLD, SIG_IGN);
✅ Shell 脚本:
command &
wait
✅ 使用 systemd 管理服务,而不是裸跑进程
CentOS 出现僵尸进程,不是系统问题,而是父进程没有回收子进程。
如果你愿意,可以把:
ps -ef贴出来,我可以帮你精确定位是哪个父进程导致僵尸。