温馨提示×

怎样发现debian僵尸进程

小樊
39
2026-10-10 21:09:31
栏目: 智能运维

在 Debian(以及其它 Linux 发行版)里,“僵尸进程(zombie / defunct)”本质上是已经结束、但父进程还没调用 wait() 回收的进程。它们不占 CPU、不占内存,但会占用 PID。下面从发现 → 判断 → 处理三步说明。


一、如何发现僵尸进程

1. 使用 ps 查看

ps -ef | grep '[d]efunct'

或

ps aux | awk '$8 ~ /Z/'

僵尸进程在 STAT 列通常显示为:

  • Z
  • Z+
  • Zs

示例:

user  1234  1200  0 10:00 ?  00:00:00 [process] <defunct>

2. 使用 top / htop

top

在任务统计区会看到:

Tasks: 210 total,   1 zombie

htop 更直观,僵尸进程通常标记为灰色或 Z。

3. 查看系统僵尸数量

grep zombies /proc/stat

或直接:

ps -eo stat | grep -c Z

二、如何判断僵尸进程的“来源”

僵尸进程本身已经死掉,关键是找它的父进程。

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

例如:

PID   PPID  STAT CMD
1234  1200  Z    [xxx] <defunct>

说明:

  • 1234 是僵尸
  • 1200 是父进程 PID

查看父进程:

ps -p 1200 -o pid,cmd,stat

三、如何处理僵尸进程

✅ 正确方式(推荐)

重启或修复父进程

kill -TERM 1200
# 若无效
kill -KILL 1200

父进程退出后,僵尸会被 init / systemd 接管并回收。


❌ 错误方式(无效)

kill -9 1234   # 对僵尸进程无效

僵尸已经“死了”,kill 不起作用。


四、常见产生僵尸的原因

  • 父进程:
    • 没有正确处理 SIGCHLD
    • 写错了 wait() / waitpid()
  • 服务 bug(如某些 Java / Python / C 程序)
  • 父进程卡死或死循环

五、防止僵尸进程(开发角度)

  • 父进程调用:
    signal(SIGCHLD, SIG_IGN);
    
    或
    waitpid(-1, NULL, WNOHANG);
    
  • 使用 systemd 管理子进程
  • 避免“父进程不退出、子进程频繁 fork”

六、快速排查清单(总结)

# 1. 查看僵尸
ps -eo pid,ppid,stat,cmd | grep Z

# 2. 找父进程
ps -p <PPID> -o pid,cmd

# 3. 重启或杀父进程
systemctl restart <service>
# 或
kill -9 <PPID>

如果你愿意,可以把 ps 输出贴出来,我可以帮你精确定位是哪个服务在产生僵尸进程。

0 踩