在 CentOS(以及其它 Linux 发行版)中,僵尸进程(Zombie / defunct)本身是已经结束执行、但父进程还没回收其退出状态的进程。它不占用 CPU、内存等资源,只是占用一个进程号(PID)。因此“杀僵尸进程”的本质,是让其父进程回收它,或结束父进程。
下面按「查看 → 分析 → 处理」说明。
ps -ef | grep defunct
或
ps aux | awk '$8 ~ /Z/'
示例:
user 12345 123 0 10:00 ? 00:00:00 [process] <defunct>
Z 或 <defunct> 表示僵尸top
看 Tasks: 一行:
Tasks: 200 total, 1 running, 198 sleeping, 0 stopped, 1 zombie
ps -o pid,ppid,stat,cmd -p <僵尸PID>
例如:
ps -o pid,ppid,stat,cmd -p 12345
假设输出:
PID PPID STAT CMD
12345 123 Z [process] <defunct>
说明:
如果父进程是正常服务(如 java、nginx、python):
systemctl restart <服务名>
如果父进程异常、无法回收:
kill -9 <父进程PID>
init(PID 1)接管并自动回收⚠️ 注意:
kill -9 12345 # 无效
如果僵尸的 PPID 是 1:
ps -ef | grep defunct
父进程是 java:
systemctl restart myapp
脚本未 wait 子进程:
./child &
# 缺少 wait
修复方式:
wait./childSIGCHLDwait() / waitpid()fork 后不回收systemd 管理服务僵尸进程杀不掉,只能杀父进程或重启父服务;不能直接 kill 僵尸。
如果你愿意,可以把 ps -ef | grep defunct 的输出贴出来,我可以帮你具体判断该怎么处理。