在 CentOS(以及大多数 Linux 发行版)中,**僵尸进程(Zombie / defunct)**本身是已经结束、但父进程还没“收尸”(调用 wait())的进程。
僵尸进程不占 CPU、内存,只占用一个进程号(PID),通常不能直接 kill 掉。
下面按「排查 → 处理 → 预防」说明。
top
看这一行:
Tasks: 120 total, 1 zombie
zombie > 0 表示有僵尸进程。
ps -ef | grep defunct
或
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
示例输出:
PID PPID STAT CMD
1234 567 Z [java] <defunct>
PID:僵尸进程 IDPPID:父进程 ID(关键)僵尸进程无法直接 kill,只能让其父进程退出或重启
kill -9 PPID
或
kill -TERM PPID
父进程退出后,僵尸进程会被 init(PID 1)接管并清理。
如果是某个服务产生大量僵尸:
systemctl restart 服务名
例如:
systemctl restart httpd
systemctl restart nginx
一般不会,但如果是:
只能:
| 操作 | 是否有效 |
|---|---|
kill -9 僵尸PID |
❌ 无效 |
killall 僵尸进程名 |
❌ 无效 |
| 杀父进程 | ✅ 有效 |
| 重启服务 | ✅ 有效 |
SIGCHLDwait() / waitpid()signal(SIGCHLD, SIG_IGN)(某些情况)systemd 管理进程nohup + & 长期孤儿进程ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print "Zombie PID:",$1,"PPID:",$2}'
如果你愿意,可以把:
ps -ef | grep defunct 的输出top 截图发出来,我可以帮你判断具体该杀哪个父进程。