温馨提示×

centos怎么排查僵尸进程

小樊
37
2026-09-21 13:19:51
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)中,排查和处理**僵尸进程(Zombie / defunct 进程)**通常可以按下面几个步骤来做。


一、什么是僵尸进程

僵尸进程是已经结束运行,但其父进程还没有调用 wait() 回收它的进程。
特征:

  • 状态为 Z(zombie)
  • 占用极少资源(不占 CPU、内存)
  • 不能直接 kill

二、查看僵尸进程

1. 使用 ps 查看

ps -ef | grep defunct

或

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

2. 使用 top

top

在任务区看:

Tasks:  xx total,  x zombie

3. 查看僵尸进程数量

ps aux | awk '$8 ~ /Z/ {print $2}' | wc -l

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

僵尸进程无法 kill,关键是找父进程(PPID)

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

示例输出:

 1234  1000 Z    [java] <defunct>

说明:

  • 僵尸 PID:1234
  • 父进程 PID:1000

查看父进程信息:

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

四、处理僵尸进程的方法

✅ 方法 1:让父进程回收(推荐)

  • 如果是业务程序 bug:重启父进程
systemctl restart 服务名
# 或
kill -TERM 父进程PID

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


✅ 方法 2:杀死父进程(谨慎)

如果父进程无用或异常:

kill -9 父进程PID

⚠️ 注意:

  • 不要直接 kill -9 僵尸PID(无效)
  • 杀父进程可能影响业务

✅ 方法 3:交给 systemd(CentOS 7+)

如果父进程是某个服务:

systemctl status 服务名
journalctl -u 服务名

五、常见导致僵尸进程的原因

  • 程序未正确处理子进程退出(wait())
  • 多线程程序中主线程异常
  • 脚本 fork 后未 wait
  • Java / Python 调用外部命令未回收

六、预防建议

  • 写代码时正确处理 SIGCHLD
  • 使用 waitpid()
  • 避免频繁 fork 不回收
  • 监控僵尸进程数量(Zabbix / Prometheus)

如果你愿意,可以把 ps 或 top 的输出贴出来,我可以帮你具体分析是哪个进程导致的。

0 踩