在 CentOS(以及其他 Linux 发行版)中,僵尸进程(Zombie / defunct)本身是不能被 kill -9 杀掉的,因为它已经“死”了,只是还在进程表里等父进程来“收尸”。
正确思路是:杀掉或修复它的父进程。
ps -ef | grep defunct
# 或
ps aux | awk '$8 ~ /Z/'
你会看到类似:
user 12345 12300 0 10:00 ? 00:00:00 [xxx] <defunct>
12345 是僵尸进程 PID12300 是它的 父进程 PPIDkill -9 12345 # 无效
因为僵尸进程:
所以 kill 对它无效。
kill -9 12300
或优雅一点:
kill 12300
父进程死后:
init(PID 1)收养wait() 回收⚠️ 注意:
如果是你自己的程序:
wait() / waitpid()SIGCHLD例如:
signal(SIGCHLD, SIG_IGN);
(某些情况下可避免僵尸)
systemctl restart 服务名
例如:
systemctl restart nginx
ps -o ppid= -p 僵尸PID
如果 PPID = 1:
systemctl daemon-reexec
或重启系统(最后手段)
如果是容器里:
init(如 tini)docker restart 容器ID
僵尸进程杀不掉是正常的,杀它的父进程才能解决。
如果你愿意,可以把:
ps -ef | grep defunct 输出发给我,我可以帮你判断该不该杀、怎么杀最安全。