温馨提示×

如何判断ubuntu僵尸进程

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

在 Ubuntu(以及其他 Linux 发行版)中,**僵尸进程(Zombie Process)**是指已经结束运行、但其父进程还没有调用 wait() 或 waitpid() 来回收其退出状态的进程。僵尸进程本身不占用 CPU 和内存,但会占用进程表项(PID),过多时可能导致系统无法创建新进程。

下面从如何判断和如何处理两方面说明。


一、如何判断僵尸进程

1. 使用 ps 命令

最常用的方法:

ps aux | grep Z

或更准确地看进程状态:

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

僵尸进程在 STAT 列会显示:

  • Z:僵尸进程
  • Z+:前台僵尸进程

示例输出:

1001  999 Z   [python] <defunct>

说明:

  • 1001:僵尸进程 PID
  • 999:父进程 PID(PPID)
  • <defunct> 表示已死但未回收

2. 使用 top / htop

top

top

查看 S(状态)列,出现 Z 即为僵尸进程; 顶部还会显示:

Tasks: 210 total, 1 zombie

htop(更直观)

sudo apt install htop
htop

僵尸进程通常显示为灰色,状态为 Z。


3. 查看系统僵尸进程数量

ps aux | awk '$8 ~ /Z/ {print}'

或:

cat /proc/stat | grep procs_zombie

二、僵尸进程的常见原因

  • 父进程:
    • 编写有误,未调用 wait()
    • 父进程卡死或阻塞
    • 父进程是长期运行的服务(如 Java、Python、Shell)

三、如何处理僵尸进程

⚠️ 注意

不能直接 kill 僵尸进程:

kill -9 <zombie_pid>   # 无效

必须通过其父进程来处理。


方法 1:杀死或重启父进程(最常用)

kill -9 <父进程PID>

示例:

kill -9 999

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


方法 2:让父进程正确回收(开发层面)

如果是你自己写的程序:

  • C/C++:调用 wait() / waitpid()
  • Python:使用 subprocess 并正确 join()
  • Shell:避免 & 后不 wait

方法 3:重启相关服务

若是系统服务产生僵尸:

systemctl restart <service>

四、僵尸进程是否需要担心?

  • 少量僵尸进程:一般无害
  • 大量僵尸进程(成百上千):需要排查程序 bug

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

0 踩