温馨提示×

centos怎么检测僵尸进程

小樊
34
2026-09-21 13:12:51
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)中,**僵尸进程(Zombie / defunct 进程)**是指已经结束运行,但父进程还没有调用 wait() 回收其资源的进程。下面介绍几种常用检测和处理方法。


一、检测僵尸进程

1. 使用 ps 命令

ps -ef | grep defunct

或

ps aux | grep Z

更直观一点:

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

说明:

  • STAT 为 Z 或 Z+ 表示僵尸进程
  • defunct 也代表僵尸

2. 查看系统僵尸进程数量

ps -eo stat | grep Z | wc -l

或在 top 中查看:

top

顶部有一行类似:

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

zombie 即为僵尸进程数量。


3. 使用 pstree 定位来源

pstree -p -s <僵尸进程PID>

可以查看是哪个父进程导致其变成僵尸。


二、查看僵尸进程的父进程

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

或:

cat /proc/<僵尸PID>/status

三、如何处理僵尸进程

⚠️ 僵尸进程本身不能直接 kill

方法 1:杀掉或重启父进程(最常见)

kill -9 <父进程PID>

或重启相关服务:

systemctl restart <服务名>

父进程退出后,僵尸进程会被 init(PID 1)接管并自动回收。


方法 2:让父进程正确回收(开发层面)

如果是自己写的程序:

  • 父进程应调用 wait() / waitpid()
  • 或使用 SIGCHLD 信号处理子进程退出

方法 3:特殊情况(不推荐)

如果父进程是 PID 1 且一直不回收,可能需要:

  • 重启系统
  • 修复相关服务逻辑

四、常见误区

❌ kill -9 僵尸PID
✅ 无效,僵尸已经“死”了,只是还没被回收

❌ 僵尸进程占用 CPU / 内存
✅ 基本不占资源,但过多会影响系统稳定性


五、简单一键检测脚本(示例)

#!/bin/bash
echo "Zombie processes:"
ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print}'

如果你愿意,可以贴一下 ps 或 top 的输出,我可以帮你分析是哪个服务导致的僵尸进程。

0 踩