在 CentOS(以及一般 Linux)里,“僵尸进程(zombie,状态 Z)”本身不能被直接 kill,因为它们已经退出,只是还在进程表里等父进程回收。批量清理僵尸的核心思路是:找到并处理好它们的父进程。
下面按常用程度给你几种方法。
ps -ef | awk '$8 ~ /Z/ {print}'
# 或
ps aux | awk '$8 ~ /Z/ {print}'
或者只看数量:
ps aux | awk '$8 ~ /Z/' | wc -l
ps -eo pid,ppid,stat,comm | awk '$3=="Z" {print $1, $2}'
ps -eo pid,ppid,stat | awk '$3=="Z" {print $2}' | sort -u
直接重启或杀掉父进程即可回收僵尸:
for ppid in $(ps -eo pid,ppid,stat | awk '$3=="Z" {print $2}' | sort -u); do
kill -TERM $ppid
done
如果杀不掉:
kill -9 $ppid
⚠️ 注意:kill -9 父进程会影响该父进程管理的所有子进程
systemctl restart 服务名
例如:
systemctl restart httpd
systemctl restart php-fpm
现代 CentOS(7+)是 systemd:
ps -p 1 -o comm=
如果是 systemd:
systemctl daemon-reexec
#!/bin/bash
for z in $(ps -eo pid,ppid,stat | awk '$3=="Z" {print $2}' | sort -u); do
echo "restart parent: $z"
kill -TERM "$z" 2>/dev/null
done
❌ 以下僵尸无法直接清理:
PID 1D(不可中断睡眠)可用:
ps -eo pid,ppid,stat,comm | awk '$3=="Z"'
如果父进程是 D 状态,只能重启服务器。
wait() / waitpid()signal(SIGCHLD, SIG_IGN)systemd 管理服务如果你愿意,可以把下面命令的输出贴出来,我可以直接帮你判断该怎么批量清:
ps -eo pid,ppid,stat,comm | awk '$3=="Z"'