在 CentOS 系统中,僵尸进程(Zombie / Z 状态)是已经结束但父进程还没回收的进程,它们不占用 CPU / 内存,但会占用 PID。
僵尸进程本身不能被直接 kill,只能从父进程入手解决。
ps -eo pid,ppid,stat,cmd | grep ' Z'
或:
top
如果看到:
Tasks: 1 zombie
说明存在僵尸进程。
ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
示例输出:
PID PPID STATE CMD
1234 1000 Z [test.sh] <defunct>
僵尸进程状态是:
Z (zombie)
✅ 已经死了
❌ 不能被 kill
原因:
wait() / waitpid() 回收假设:
12341000kill -9 1000
或先尝试优雅退出:
kill 1000
⚠️ 注意:
init/systemd 接管并自动清理如果是服务产生的僵尸进程:
ps -fp 1000
然后重启服务:
systemctl restart 服务名
例如:
systemctl restart httpd
systemctl restart php-fpm
如果父进程是 1:
ps -eo pid,ppid,stat,cmd | grep Z
✅ 通常 重启系统 才能彻底清理
❌ 不建议直接 kill PID 1
ps -eo pid,ppid,stat | grep Z
无输出说明僵尸已清除。
wait() / waitpid()signal(SIGCHLD, SIG_IGN)kill -9 父进程supervisor / systemd 管理进程ps -eo stat | grep -c Z
# 1. 查看僵尸进程
ps -eo pid,ppid,stat,cmd | grep Z
# 2. 找父进程
ps -fp 父PID
# 3. 杀父进程
kill -9 父PID
# 4. 重启服务
systemctl restart 服务名
如果你愿意,可以把 ps -eo pid,ppid,stat,cmd 的输出贴出来,我可以帮你判断该不该杀、杀哪个最安全。