CentOS 僵尸进程处理工具与命令清单
一、快速判断与定位工具
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'。pstree -p | grep -i defunct。sar -q | grep -i Z。二、清理僵尸进程的正确方法
kill -s SIGCHLD <PPID>。kill -15 <PPID> 或 kill -9 <PPID>。ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9。三、一键脚本示例
#!/usr/bin/env bash
set -euo pipefail
zombies=$(ps -A -o stat,ppid,pid,cmd | awk '$1 ~ /^[Zz]/ {print $2}' | sort -u)
if [[ -z "$zombies" ]]; then
echo "未检测到僵尸进程(状态为 Z/z)。"
exit 0
fi
echo "发现僵尸进程对应的父进程PPID列表:"
echo "$zombies"
for ppid in $zombies; do
if [[ "$ppid" -eq 1 ]]; then
echo "PPID=$ppid 为 PID 1(init/systemd),跳过以避免影响系统。"
continue
fi
echo "向父进程 $ppid 发送 SIGCHLD ..."
kill -s SIGCHLD "$ppid" 2>/dev/null || true
# 短暂等待回收
sleep 2
# 若仍存在,尝试温和终止父进程
if ps -p "$ppid" >/dev/null 2>&1; then
echo "父进程 $ppid 仍存在,发送 SIGTERM ..."
kill -15 "$ppid" 2>/dev/null || true
sleep 5
fi
# 最后手段
if ps -p "$ppid" >/dev/null 2>&1; then
echo "父进程 $ppid 仍未退出,发送 SIGKILL ..."
kill -9 "$ppid" 2>/dev/null || true
fi
done
# 复核
left=$(ps -A -o stat,ppid,pid,cmd | awk '$1 ~ /^[Zz]/ {print $2}' | sort -u | wc -l)
echo "清理完成,当前剩余僵尸进程数量:$left"
四、常见误区与建议
kill -9 系统关键父进程(如 PID 1)。应先评估影响,必要时安排重启。