温馨提示×

怎么定位ubuntu僵尸进程

小樊
44
2026-09-13 05:11:15
栏目: 智能运维

在 Ubuntu(以及其它 Linux 发行版)上,“僵尸进程(Zombie / defunct 进程)”是指已经结束运行,但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU、内存,但会占用 PID 表项。

下面是定位僵尸进程的常用方法。


一、快速查看僵尸进程

1. 使用 ps

ps aux | grep Z

或

ps -ef | grep defunct

僵尸进程在 STAT 列会显示为:

  • Z 或 Z+
  • 进程名通常是 <defunct>

示例:

user   12345  0.0  0.0      0     0 ?  Z  10:00  0:00 [python] <defunct>

2. 使用 top / htop

top

在任务统计区会看到:

Tasks: 210 total,   1 zombie

htop 更直观:

htop

僵尸进程会显示为灰色或标记为 Z


3. 直接从 /proc 看

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

二、找出“谁制造了僵尸进程”

僵尸进程本身无法被 kill,必须处理它的父进程。

查看僵尸进程的父进程 PPID

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

例如:

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

说明 PPID = 1000 的进程没有回收子进程。


查看父进程信息

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

常见原因:

  • 父进程是长期运行的服务(如 Java / Python / C 程序)
  • 父进程写错了,没有 wait()
  • 父进程卡死或崩溃

三、确认系统僵尸数量

ps -eo stat | grep -c Z

或

cat /proc/loadavg

(僵尸进程不计入 load)


四、如何处理僵尸进程

✅ 正确方式

  1. 重启父进程
kill -TERM 1000

或

systemctl restart 服务名
  1. 如果父进程是 init(PID 1),重启系统(极少见)

❌ 错误方式(无效)

kill -9 僵尸PID

⚠️ 僵尸进程已经“死”了,不能被 kill


五、开发层面避免僵尸进程

  • 父进程调用 wait() / waitpid()
  • 使用 signal(SIGCHLD, SIG_IGN)
  • 使用 fork() + exec() 时注意回收
  • 使用线程或进程池

如果你愿意,可以把:

ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'

的输出贴出来,我可以帮你具体分析是哪个服务或程序产生了僵尸进程。

0 踩