温馨提示×

centos僵尸进程如何查杀

小樊
43
2026-09-03 05:27:31
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)中,僵尸进程(Zombie / defunct)本身是已经结束执行、但父进程还没回收其退出状态的进程。它不占用 CPU、内存等资源,只是占用一个进程号(PID)。因此“杀僵尸进程”的本质,是让其父进程回收它,或结束父进程

下面按「查看 → 分析 → 处理」说明。


一、查看僵尸进程

1. 使用 ps 查看

ps -ef | grep defunct

ps aux | awk '$8 ~ /Z/'

示例:

user     12345  123  0 10:00 ?  00:00:00 [process] <defunct>
  • 第 3 列(PPID)是父进程 ID
  • 状态 Z<defunct> 表示僵尸

2. 查看系统僵尸数量

top

Tasks: 一行:

Tasks: 200 total,   1 running, 198 sleeping,   0 stopped,   1 zombie

二、找到僵尸进程的父进程

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

例如:

ps -o pid,ppid,stat,cmd -p 12345

假设输出:

PID   PPID  STAT CMD
12345 123   Z    [process] <defunct>

说明:

  • 僵尸 PID:12345
  • 父进程 PID:123

三、处理僵尸进程(重点)

✅ 方法 1:让父进程回收(推荐)

如果父进程是正常服务(如 java、nginx、python):

  • 重启该服务即可回收僵尸
systemctl restart <服务名>

✅ 方法 2:kill 父进程(慎用)

如果父进程异常、无法回收:

kill -9 <父进程PID>
  • 父进程被杀后,僵尸会被 init(PID 1)接管并自动回收

⚠️ 注意:

  • 不能直接 kill 僵尸进程
kill -9 12345   # 无效

✅ 方法 3:父进程是 init(PID 1)

如果僵尸的 PPID 是 1:

  • 通常是系统或容器问题
  • 在容器中需重启容器
  • 在物理机/虚拟机中一般重启系统

四、常见场景示例

场景 1:Java 程序产生大量僵尸

ps -ef | grep defunct

父进程是 java:

systemctl restart myapp

场景 2:Shell 脚本 fork 炸弹或 wait 缺失

脚本未 wait 子进程:

./child &
# 缺少 wait

修复方式:

  • 脚本中加 wait
  • 或改为 ./child

五、防止僵尸进程

  1. 父进程正确处理 SIGCHLD
  2. 使用 wait() / waitpid()
  3. 避免 fork 后不回收
  4. 使用 systemd 管理服务

六、一句话总结

僵尸进程杀不掉,只能杀父进程或重启父服务;不能直接 kill 僵尸。

如果你愿意,可以把 ps -ef | grep defunct 的输出贴出来,我可以帮你具体判断该怎么处理。

0