温馨提示×

如何认识ubuntu僵尸进程

小樊
45
2026-10-15 22:09:18
栏目: 智能运维

在 Ubuntu(以及其它 Linux 系统)中,**僵尸进程(Zombie Process)**是一个常见但容易被误解的概念。下面从“是什么、为什么、怎么看、怎么处理、如何预防”几个方面来说明。


一、什么是僵尸进程

僵尸进程是指:

一个已经结束运行(退出)的进程,但其父进程还没有调用 wait() / waitpid() 来回收它的退出状态。

此时进程:

  • 已经不占用 CPU、内存等资源
  • 仍然在进程表中保留一条记录(PID、退出码等)

在 ps 中通常显示为:

STAT = Z

例如:

1234 ?        Z      0:00 [bash] <defunct>

二、僵尸进程是怎么产生的

典型流程:

  1. 子进程调用 exit() 退出
  2. 内核保留其退出信息
  3. 父进程未及时处理子进程退出
  4. 子进程变成僵尸

常见原因:

  • 父进程逻辑错误,忘记 wait()
  • 父进程阻塞、死循环
  • 父进程自身已经异常(但还没死)

三、如何查看 Ubuntu 中的僵尸进程

1. 使用 ps

ps aux | grep ' Z'

或:

ps -eo pid,ppid,stat,cmd | grep '^.* Z'

2. 查看僵尸数量

ps aux | awk '$8=="Z" {print}'

或:

top

在 Tasks 一行会看到:

Tasks: 210 total,   1 zombie

四、僵尸进程的危害

✅ 一般不会直接拖垮系统
❌ 但问题在于:

  • 占用 PID(PID 用尽后无法创建新进程)
  • 说明父进程可能存在 bug
  • 大量僵尸往往是程序异常信号

五、如何处理僵尸进程

❌ 不能直接 kill 僵尸进程

kill -9 <zombie_pid>   # 无效

✅ 正确做法

方法 1:让父进程回收

  • 重启父进程
  • 修复代码中 wait() 逻辑

方法 2:杀掉父进程(慎用)

kill -9 <parent_pid>

之后僵尸会被 init / systemd 收养并回收。


六、编程层面如何避免(C / Python 示例)

C

signal(SIGCHLD, SIG_IGN);

或:

waitpid(-1, NULL, WNOHANG);

Python

import signal
signal.signal(signal.SIGCHLD, signal.SIG_IGN)

或使用:

subprocess.Popen(..., start_new_session=True)

七、总结一句话

僵尸进程不是“死不掉的进程”,而是“父进程没善后的进程”。

如果你愿意,可以:

  • 贴出 ps 输出
  • 说明是服务 / 脚本 / Docker 环境
  • 我可以帮你具体分析是哪类问题

0 踩