在 CentOS(以及大多数 Linux 发行版)中,僵尸进程(Zombie / defunct 进程)频繁出现,通常不是系统本身的问题,而是应用程序或进程管理方式有问题。下面从原理、常见原因和解决办法三个层面说明。
僵尸进程是:
wait() / waitpid() 回收它此时进程:
ps 中显示为 Z 或 defunct僵尸进程本身不可
kill,只能由父进程回收或父进程退出后由init/systemd接管。
典型场景:
fork() 后不 wait()system()、popen() 但未关闭示例:
pid = fork();
if (pid == 0) {
exit(0);
}
// 父进程没有 wait(pid)
结果:子进程变成僵尸。
例如:
forkSIGCHLD如果父进程:
SIGCHLD就会导致僵尸堆积。
父进程:
D 状态(不可中断睡眠)卡住此时它无法回收子进程,僵尸会越来越多。
nohup / & / shell 脚本不规范例如:
while true; do
./xxx &
done
wait某些服务:
Type=forking 但主进程提前退出也可能导致僵尸。
如:
ps -ef | grep defunct
ps -lA | grep Z
top
查看父进程 PID(PPID)。
ps -o pid,ppid,stat,cmd -p <僵尸PID>
频繁出现的僵尸,通常 PPID 是同一个进程。
wait() / waitpid()SIGCHLDsystemd 回收)kill -9 <父进程PID>
注意:可能影响业务
signal(SIGCHLD, SIG_IGN)(部分场景)sigaction 显式回收forkCentOS 频繁出现僵尸进程,99% 是因为“父进程没有回收子进程”,不是系统 bug。
如果你愿意,可以把:
ps 输出发出来,我可以帮你精准定位是哪一类问题。