温馨提示×

怎样杀掉ubuntu僵尸进程

小樊
43
2026-09-16 08:59:56
栏目: 智能运维

在 Ubuntu(以及所有 Linux 系统)里,僵尸进程(Zombie / defunct)本身是“已经死掉”的进程,它只占用了进程表中的一个条目,不占用 CPU、内存或文件句柄,所以你不能直接“kill”一个僵尸进程

正确做法是:杀掉它的父进程,让 init/systemd 来回收它


一、确认是不是僵尸进程

ps -l

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

如果 STATZZ+,就是僵尸进程。


二、查看僵尸进程的父进程(PPID)

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

例如:

PID  PPID STAT CMD
1234 1000 Z    [python] <defunct>

说明父进程是 1000


三、回收僵尸进程的正确方法

✅ 方法 1:杀掉父进程(最常用)

kill -9 <父进程PPID>

kill -TERM <父进程PPID>

父进程死后,僵尸进程会被 systemd(PID 1)接管并自动清理。

⚠️ 注意:

  • 父进程可能是重要服务(如 nginxdockersystemd 子进程)
  • 杀之前确认不会影响业务

✅ 方法 2:让父进程主动回收(推荐用于自己写的程序)

如果你是开发者:

  • 在父进程中正确处理 SIGCHLD
  • 或调用 wait() / waitpid()

四、特殊情况处理

1️⃣ 父进程是 init / systemd(PID 1)

一般不会出现长期僵尸,除非 systemd bug
可尝试:

systemctl daemon-reexec

2️⃣ 大量僵尸进程(僵尸风暴)

通常是:

  • 程序频繁 fork 但不回收
  • 或父进程卡死

解决办法:

# 找到僵尸的父进程
ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

然后修复或重启对应服务。


五、常见误区 ❌

kill -9 僵尸PID → 无效
pkill 僵尸进程 → 无效
❌ 重启机器只是为了清僵尸 → 不推荐(除非别无他法)


六、一句话总结

僵尸进程杀不掉,只能杀父进程;父进程一死,僵尸自动消失。

如果你愿意,可以把 ps 输出贴出来,我可以帮你判断该杀哪个进程。

0