温馨提示×

如何定位ubuntu僵尸进程

小樊
41
2026-09-16 09:05:56
栏目: 智能运维

在 Ubuntu(及其他 Linux 系统)中,“僵尸进程(Zombie / defunct 进程)”本身是已经结束但未被父进程回收的进程,它不占用 CPU 和内存,但会占用进程表项。定位僵尸进程通常按下面的步骤进行。


一、快速查看是否存在僵尸进程

1. 使用 top

top

在顶部信息中查看:

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

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


2. 使用 ps 查找僵尸进程

ps aux | grep Z

或更准确地:

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

示例输出:

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

说明:

  • STAT=Z 表示僵尸
  • <defunct> 也是僵尸标志

二、确认僵尸进程的父进程

僵尸进程无法被 kill,只能由父进程回收。

查看父进程 PID(PPID):

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

例如:

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

三、如何处理僵尸进程

✅ 正确方式:让父进程回收

  • 如果是你自己写的程序(如 Python / C):
    • 使用 wait() / waitpid()
    • 或忽略 SIGCHLD
  • 如果是服务程序:
    systemctl restart 服务名
    

⚠️ 强制方式(不推荐但有效)

如果父进程异常且不回收:

kill -9 父进程PID

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


四、常见产生僵尸进程的原因

  • 父进程未调用 wait()
  • 父进程崩溃但未退出
  • 多线程程序中线程未正确 join
  • 容器或守护进程异常

五、监控僵尸进程(可选)

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

如果你愿意,可以把:

  • ps 输出
  • 或具体服务名(如 nginx / python / java)

发出来,我可以帮你分析是哪一个父进程导致僵尸。

0 踩