温馨提示×

centos怎么找僵尸进程

小樊
36
2026-10-12 01:07:14
栏目: 智能运维

在 CentOS(以及大多数 Linux 发行版)中,僵尸进程(Zombie / Z 状态进程) 可以通过以下方式查找和处理。


一、什么是僵尸进程

僵尸进程是已经结束运行,但父进程还没有回收它(wait)的进程,状态为 Z。
它不占 CPU、不占内存,但会占用 PID,过多时可能导致无法创建新进程。


二、查找僵尸进程的方法

方法 1:使用 ps 命令(最常用)

ps -ef | grep defunct

或

ps aux | grep ' Z'

更直观的方式:

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

示例输出:

 PID  PPID STAT CMD
12345 1000  Z    [test] <defunct>

方法 2:使用 top

top

在顶部看:

Tasks: 210 total,   1 zombie

如果有 zombie > 0,说明存在僵尸进程。

按 f → 选择 STAT 或 S 显示状态,找 Z 状态进程。


方法 3:通过 /proc 查找(进阶)

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

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

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

或者:

cat /proc/<僵尸PID>/status

看 PPid 字段。


四、如何处理僵尸进程

❌ 不能直接 kill 僵尸进程

kill -9 <僵尸PID>   # 无效

✅ 正确做法

1. 杀掉或重启父进程(最常见)

kill -9 <父进程PPID>

⚠️ 注意:确认父进程可以安全重启(如 Java、Python 服务)

2. 如果是系统服务

systemctl restart <服务名>

3. 父进程是 init(PID 1)

  • 一般是系统 bug或服务异常
  • 可考虑重启服务器(最后手段)

五、常见产生僵尸进程的原因

  • 父进程未调用 wait()
  • 多线程程序中线程未正确回收
  • 程序异常崩溃
  • 脚本 fork 后未回收子进程

六、预防建议

  • 编写程序时正确处理 SIGCHLD
  • 使用 waitpid()
  • 定期检查:
ps -eo stat | grep Z | wc -l

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

0 踩