在 CentOS(以及其他 Linux 发行版)中,僵尸进程(Zombie / defunct 进程)增多,通常不是“进程自己变成僵尸”,而是父进程没有正确回收子进程导致的。下面从原因、常见场景和排查方法三方面说明。
wait() / waitpid() 或父进程退出僵尸进程不占 CPU、内存,但占 PID,过多会导致:
- 无法创建新进程(
fork: resource temporarily unavailable)- 系统 PID 耗尽
典型例子:
systemd 拉起的后台进程fork() 但没 wait()示例:
fork();
// 子进程退出,父进程不 wait
signal(SIGCHLD, SIG_IGN)(错误用法)SIGCHLDwait()常见于:
如:
Type=forking
但:
如:
cron 每分钟启动脚本& 后台执行bash 作 PID 1tini / dumb-initps -ef | grep defunct
或
top
# 看 Tasks: xxx total, x zombie
ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
僵尸进程的 PPID 就是问题父进程。
ps -p <PPID> -o pid,stat,cmd
systemctl status <service>
waitpid(-1, NULL, WNOHANG);
SIGCHLDsystemd 正确管理进程kill -9 <父进程PID>
僵尸进程会随父进程死亡被
init/systemd回收
CentOS 僵尸进程增多,99% 是“父进程不回收子进程”造成的,而不是系统问题。
如果你愿意,可以贴:
ps 输出我可以帮你精准定位是哪一个程序的问题。