在 CentOS(以及其他 Linux 发行版)中,僵尸进程(Zombie / defunct)本身是不能直接 kill 掉的,因为它已经退出,只是还在进程表里保留退出状态等待父进程回收。
下面按「原理 → 处理方法 → 预防」来说明。
wait() / waitpid()Z 或 <defunct>ps -l
# STAT 为 Z 就是僵尸
僵尸进程只能由父进程回收。
ps -eo pid,ppid,stat,comm | grep Z
kill -9 父进程PID
父进程死后,僵尸进程会被 init(PID 1)接管并回收。
⚠️ 注意:父进程可能是重要服务(如 java、nginx、docker),先确认能否重启。
如果父进程是你能控制的程序:
systemctl restart 服务名
SIGCHLDkill -SIGCHLD 父进程PID
(部分程序有效)
如果父进程是系统关键进程且无法重启:
reboot
ps -ef | grep java
systemctl restart java服务
waitfor i in *; do
(do_job $i) &
done
wait
kill -9 僵尸PID # 无效
因为:
SIGCHLDwait() / waitpid()fork 后不回收如果你愿意,可以把下面信息发我,我可以帮你具体分析:
ps -ef | grep defunct 输出cat /etc/redhat-release)