温馨提示×

怎样排查ubuntu僵尸进程

小樊
45
2026-09-22 10:26:33
栏目: 智能运维

在 Ubuntu(及其他 Linux 发行版)上,“僵尸进程(Zombie / defunct 进程)”本质上是已经结束运行,但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU/内存,但会占用 PID 表项,数量过多可能有问题。

下面按排查 → 定位 → 处理的顺序说明。


一、确认是否存在僵尸进程

1. 使用 top

top

看这一行:

Tasks: 234 total,   1 running, 230 sleeping,   0 stopped,   3 zombie

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

2. 使用 ps 精确查找

ps aux | grep ' Z'

或:

ps -ef | awk '$8 ~ /Z/'

常见显示:

user   12345  6789  0 10:00 ?  00:00:00 [process] <defunct>
  • Z 状态 = 僵尸
  • PPID(第 3 列)= 父进程 PID

二、定位僵尸进程的“罪魁祸首(父进程)”

僵尸进程不能直接 kill,只能让父进程回收。

查看父进程:

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

例如:

PID   PPID  STAT CMD
12345  6789  Z    [myapp] <defunct>

说明 6789 是父进程。

查看父进程信息:

ps -p 6789 -o pid,cmd,stat

三、处理僵尸进程的方法

✅ 方法 1:重启 / 结束父进程(最常用)

如果父进程可以重启:

kill -TERM 6789
# 或
systemctl restart 服务名

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


✅ 方法 2:通知父进程回收(不杀进程)

有些程序支持 SIGCHLD:

kill -CHLD 6789

(是否生效取决于程序实现)


❌ 错误做法

kill -9 僵尸PID

无效,因为僵尸进程已经“死”了。


四、如果父进程是 PID 1(init / systemd)

说明系统层面有问题,常见于:

  • Docker 容器
  • 某些服务以 PID 1 运行但未正确处理子进程

解决方式:

  • 重启容器 / 服务
  • 使用 dumb-init 或 tini 作为 PID 1

五、自动化排查脚本(可选)

ps -eo pid,ppid,stat,cmd | awk '$3=="Z" {print "Zombie:", $1, "Parent:", $2}'

六、预防建议

  • 程序正确调用 wait() / waitpid()
  • 使用 systemd 管理服务
  • 容器中用 tini:
ENTRYPOINT ["tini", "--", "你的程序"]

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

0 踩