温馨提示×

怎么统计debian僵尸进程

小樊
41
2026-09-10 22:13:33
栏目: 智能运维

在 Debian(以及其他 Linux 发行版)中,**僵尸进程(Zombie / defunct 进程)**是指已经结束运行、但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU 和内存,但会占用 PID。

下面从查看、统计、处理几个方面说明。


一、查看僵尸进程

1. 使用 ps 命令

ps aux | awk '$8 ~ /Z/ {print}'

或更直观地:

ps -ef | grep defunct

字段说明:

  • Zdefunct 表示僵尸状态
  • 第 2 列是 PID
  • 第 3 列是 PPID(父进程)

2. 使用 top

top

在任务统计区能看到:

Tasks: 210 total,   1 running, 208 sleeping,   0 stopped,   1 zombie

二、统计僵尸进程数量

方法 1:直接统计

ps aux | awk '$8 ~ /Z/ {count++} END {print count}'

方法 2:从 /proc 统计

for p in /proc/[0-9]*; do
  if [ "$(cat $p/stat 2>/dev/null | awk '{print $3}')" = "Z" ]; then
    ((count++))
  fi
done
echo $count

三、找出僵尸进程的父进程

僵尸进程不能直接 kill,只能处理其父进程:

ps -o pid,ppid,stat,comm -p <僵尸PID>

或批量查看:

ps -eo pid,ppid,stat,comm | awk '$3=="Z"'

四、如何处理僵尸进程

1. 正常方式(推荐)

  • 重启父进程
systemctl restart <服务名>

kill -TERM <PPID>

2. 父进程无响应

  • 强制杀父进程(会使其子进程被 init 接管并回收):
kill -9 <PPID>

⚠️ 注意:

  • 杀父进程可能影响业务
  • 如果父进程是 init(PID 1),不能杀

五、常见原因

  • 父进程 bug,没有 wait()
  • 服务异常但未退出
  • 多线程程序中线程未正确回收子进程

六、监控建议(Debian)

  • monit
  • zabbix
  • Prometheus + node_exporter(有 zombie 指标)

如果你愿意,可以贴一下:

ps -eo pid,ppid,stat,comm | awk '$3=="Z"'

的输出,我可以帮你具体分析是哪一个服务的问题。

0