温馨提示×

centos如何排查僵尸进程

小樊
38
2026-10-06 05:29:31
栏目: 智能运维

在 CentOS(以及一般 Linux 系统)中,排查和处理**僵尸进程(Zombie / defunct)**通常可以按以下步骤进行。


一、什么是僵尸进程

僵尸进程是已经退出,但父进程尚未调用 wait() 回收其资源的进程,状态显示为 Z(zombie)。
僵尸进程本身不占 CPU 和内存,但会占用 PID,过多时可能导致无法创建新进程。


二、查看僵尸进程

1. 使用 ps 查看

ps -ef | grep defunct

或

ps aux | grep ' Z'

示例:

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

其中 1200 是父进程 PID(PPID)。

2. 使用 top

top

查看右上角:

Tasks: 210 total,   1 zombie

3. 统计僵尸进程数

ps -e -o stat | grep Z | wc -l

三、定位僵尸进程的父进程

ps -eo pid,ppid,stat,cmd | awk '$3=="Z"'

或:

ps -l <僵尸进程PID>

重点看 PPID(父进程 ID)。


四、排查原因

常见原因:

  1. 父进程 bug:未正确处理子进程退出
  2. 父进程卡死 / 死锁
  3. 父进程被暂停(stopped)
  4. 服务异常(如 Java、Python、Nginx _worker)

可查看父进程状态:

ps -p <PPID> -o pid,ppid,stat,cmd

若父进程状态为 D(不可中断睡眠)或 T(停止),需重点关注。


五、处理僵尸进程

❌ 不能直接 kill 僵尸进程

kill -9 <僵尸PID>   # 无效

✅ 正确做法

方法 1:重启 / 结束父进程(最常用)

kill -TERM <PPID>
# 或
kill -9 <PPID>

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

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

  • 父进程中调用 wait() / waitpid()
  • 使用 signal(SIGCHLD, SIG_IGN)

方法 3:若父进程是 systemd 服务

systemctl restart <服务名>

六、特殊场景

1. 父进程是 PID 1(init / systemd)

  • 一般不会产生僵尸
  • 若产生,可能是 systemd 异常,需重启系统

2. 大量僵尸进程

  • 检查是否有 fork 炸弹
  • 检查定时任务 / 脚本

七、预防建议

  • 编写多进程程序时正确处理 SIGCHLD
  • 使用 supervisor / systemd 管理进程
  • 定期监控:
ps -e -o stat | grep Z | wc -l

如果你有 具体进程名 / 日志 / ps 输出,我可以帮你具体分析是哪一个服务导致僵尸进程。

0 踩