在 CentOS(以及其他 Linux 发行版)中,僵尸进程(Zombie / defunct)本身是不能直接 kill 掉的,因为它已经退出,只是还在进程表里保留信息等待父进程回收。
下面按「原理 → 处理方式 → 实操命令」来说明。
wait() / waitpid()Z(zombie)kill -9 <zombie_pid>
❌ 无效
因为进程已经死了,kill 的是“已经不存在的进程”
找到僵尸进程的父进程(PPID),重启/杀掉父进程,僵尸会被 init(PID 1)回收。
ps -ef | grep defunct
# 或
ps aux | awk '$8 ~ /Z/'
示例:
user 1234 1200 0 10:00 ? 00:00:00 [java] <defunct>
ps -p 1200 -o pid,ppid,cmd
kill -TERM 1200
# 若无效
kill -9 1200
✅ 父进程退出后,僵尸会被 systemd / init 接管并清理
如果父进程是你自己的程序:
SIGCHLDwait() / waitpid()示例(C):
signal(SIGCHLD, SIG_IGN);
或
while (waitpid(-1, NULL, WNOHANG) > 0);
如果是某个服务产生僵尸:
systemctl restart 服务名
例如:
systemctl restart nginx
systemctl restart php-fpm
systemd 管理服务fork() 后不 wait()ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'
如果你愿意,可以贴一下:
ps -ef | grep defunct 输出我可以帮你具体分析该怎么处理。