温馨提示×

如何清理ubuntu僵尸进程

小樊
44
2026-07-27 12:43:48
栏目: 智能运维

在 Ubuntu(和其他 Linux 系统)中,僵尸进程(Zombie Process)本身无法直接被 kill 掉,因为它们已经结束运行,只是还留在进程表中等父进程“收尸”。下面按原理 → 排查 → 处理 → 预防一步步说明。


一、僵尸进程是什么?

  • 状态显示为 Z(Zombie)
  • 不占用 CPU、内存
  • 只是进程表的一项记录
  • 产生原因:子进程退出,但父进程没有调用 wait() / waitpid()

二、如何确认僵尸进程

1️⃣ 使用 top

top

如果有僵尸进程,会看到类似:

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

2️⃣ 查找僵尸进程

ps aux | grep 'Z'

或更直观:

ps -eo pid,ppid,stat,cmd | grep Z

示例输出:

 1234  1000 Z    [example] <defunct>

说明:

  • 1234:僵尸进程 PID
  • 1000:父进程 PID
  • Z:僵尸状态

三、如何“清理”僵尸进程(重点)

✅ 正确做法:处理父进程

方法 1:等待父进程自动回收(推荐)

  • 如果父进程正常运行,只是还没来得及回收
  • 等待一段时间即可

方法 2:重启或重新加载父进程(最常见)

kill -HUP 父进程PID

或直接重启服务:

sudo systemctl restart 服务名

示例:

sudo systemctl restart nginx

方法 3:杀掉父进程(⚠️慎用)

kill -9 父进程PID
  • 父进程死后,僵尸进程会被 init / systemd 接管并回收
  • 可能影响业务

❌ 错误做法(无效)

kill -9 僵尸进程PID

完全没用
僵尸进程已经死透了,kill 不掉


四、如何找到“是哪个程序不停地产生僵尸进程”

长期分析

ps -eo pid,ppid,stat,cmd | grep Z

如果频繁出现,说明:

  • 程序有 bug
  • 父进程没有正确处理子进程退出

常见罪魁祸首

  • 自己写的脚本(没有 wait
  • 某些旧版本服务(如早期 PHP / Java / Python 程序)
  • 容器中的 init 进程不规范

五、如何避免僵尸进程(开发角度)

✅ 父进程正确处理子进程

C / C++

waitpid(-1, NULL, WNOHANG);

Shell

wait

Python

import os
os.waitpid(-1, os.WNOHANG)

✅ 使用 systemd 管理服务

  • systemd 会自动回收孤儿进程

六、快速总结(直接照做)

  1. 查僵尸进程
ps -eo pid,ppid,stat,cmd | grep Z
  1. 找到父进程 PID(PPID)

  2. 重启父进程

sudo systemctl restart 服务名
  1. 如果顽固:
kill -9 父进程PID

如果你愿意,可以把你当前的:

ps -eo pid,ppid,stat,cmd | grep Z

输出贴出来,我可以帮你精确定位是哪一个服务或程序在制造僵尸进程

0