在 CentOS(以及其他 Linux 发行版)中,僵尸进程(Zombie / defunct)本质上是已经结束、但父进程还没调用 wait() 回收其资源的进程。
僵尸进程本身不占 CPU/内存,只是占一个 PID 表项,真正要解决的是父进程的问题。
下面按“能不能直接杀 → 怎么批量找 → 怎么彻底解决”来说明。
❌ 不能直接 kill 僵尸进程
kill -9 <zombie_pid> # 无效
因为僵尸进程已经“死”了,只是还没被回收。
✅ 只能杀它的父进程(或重启父进程)
ps -ef | grep defunct
或
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
示例输出:
Z 1234 5678 [java] <defunct>
1234 是父进程 PID5678 是僵尸 PIDps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | wc -l
ps -A -ostat,ppid,pid,cmd | awk '$1 ~ /^[Zz]/{print $2}' | sort -u | xargs kill -9
⚠️ 注意:
查看父进程:
ps -p <ppid> -o pid,cmd
如果父进程是服务:
systemctl restart <service>
例如:
systemctl restart java
systemctl restart nginx
如果父进程是你们自己的程序:
SIGCHLDsignal(SIGCHLD, SIG_IGN)示例(C):
signal(SIGCHLD, SIG_IGN);
如果父进程是 1(init):
ps -A -ostat,ppid,pid,cmd | awk '$2==1 && $1 ~ /^[Zz]/'
✅ 处理方式:
systemctl daemon-reexecsupervisor / systemd 管理进程grep zombies /proc/stat
僵尸进程不能杀,只能杀父进程或重启父进程;批量处理就是找父 PID → 去重 → kill / restart。
如果你愿意,可以把:
ps -ef | grep defunct 的输出发出来,我可以帮你判断最安全的处理方式。