温馨提示×

如何查看centos僵尸进程

小樊
45
2026-08-04 16:07:02
栏目: 智能运维

在 CentOS(以及大多数 Linux 系统)中,**僵尸进程(Zombie / Z 状态)**是已经结束但还没有被父进程回收的进程。它们不占用 CPU 或内存,但会占用 PID,数量多了可能有问题。

下面是查看和处理僵尸进程的方法


一、查看僵尸进程

方法 1:使用 ps 查看(最常用)

ps -eo pid,ppid,state,cmd | grep ' Z'

说明:

  • Z 表示僵尸状态
  • pid:僵尸进程 PID
  • ppid:父进程 PID
  • cmd:进程命令

示例输出:

1001  800  Z  [test] <defunct>

方法 2:统计僵尸进程数量

ps -eo state | grep Z | wc -l

方法 3:使用 top

top

在任务信息中查看:

Tasks: 120 total,   1 running, 119 sleeping,   0 stopped,   1 zombie

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


二、定位僵尸进程的父进程

僵尸进程不能直接 kill,需要让父进程回收它

查看父进程

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

或者一次性查看所有僵尸及其父进程:

ps -eo pid,ppid,state,cmd | awk '$3=="Z"'

三、处理僵尸进程

✅ 正确做法:让父进程回收子进程

方法 1:重启或修复父进程(推荐)

如果父进程是某个服务(如 Java、Python、Nginx worker):

systemctl restart 服务名

或:

kill -HUP 父进程PID

SIGHUP 可能触发父进程重新加载并回收子进程(取决于程序实现)


方法 2:杀死父进程(谨慎)

⚠️ 不推荐直接 kill 父进程,除非确认安全。

kill -9 父进程PID

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


❌ 错误做法(无效)

kill -9 僵尸PID

僵尸进程无法被 kill,因为它已经死了。


四、自动化检测脚本(可选)

#!/bin/bash
ZOMBIES=$(ps -eo state | grep Z | wc -l)
if [ "$ZOMBIES" -gt 0 ]; then
    echo "发现 $ZOMBIES 个僵尸进程"
    ps -eo pid,ppid,state,cmd | awk '$3=="Z"'
else
    echo "没有僵尸进程"
fi

五、常见产生原因

  • 父进程未调用 wait() / waitpid()
  • 程序 Bug(如 C/C++、Python multiprocessing
  • 父进程被阻塞或异常退出

六、总结

操作 命令
查看僵尸进程 ps -eo pid,ppid,state,cmd | grep Z
统计数量 ps -eo state | grep Z | wc -l
查看父进程 ps -o ppid= -p 僵尸PID
处理方式 重启父进程 / 修复程序
能否 kill ❌ 不能

如果你愿意,可以把 ps -eftop 的输出贴出来,我可以帮你具体判断是哪个程序在产生僵尸进程

0