温馨提示×

centos僵尸进程该如何处理

小樊
44
2026-09-03 05:31:32
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)中,**僵尸进程(Zombie / defunct 进程)**本质上是已经结束运行、但父进程还没有调用 wait() 回收其退出状态的进程。它们不占用 CPU 和内存,但会占用进程号(PID),过多时可能影响系统。

下面按「查看 → 原因 → 处理方法 → 预防」来说明。


一、如何查看僵尸进程

ps -ef | grep defunct
# 或
ps aux | awk '$8 ~ /Z/'

也可以看系统整体僵尸数:

top
# 看 Tasks: xxx total, x zombie

或:

cat /proc/loadavg

二、僵尸进程的本质原因

僵尸进程无法直接 kill

kill -9 <pid>   # 对僵尸进程无效

因为:

  • 进程已经“死”了
  • 只有 父进程 能清理它

三、正确处理方式

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

查看僵尸进程的父进程:

ps -ef | grep defunct
# 或
ps -o pid,ppid,stat,cmd -p <僵尸PID>

假设父进程 PID 是 1234

① 重启父进程(最常见)

systemctl restart 服务名
# 或
kill -TERM 1234

父进程退出后:

  • 僵尸进程会被 init / systemd(PID 1)接管
  • systemd 会自动 wait() 清理

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

如果父进程无重要业务:

kill -9 1234

⚠️ 注意:

  • 可能影响业务
  • 仅用于测试或非关键服务

方法 3:编程层面修复(开发角度)

如果是自写程序导致:

  • 父进程应正确处理 SIGCHLD
  • 或使用 waitpid() / fork() + exec()

示例(C):

signal(SIGCHLD, SIG_IGN); // 自动回收子进程

Python:

signal.signal(signal.SIGCHLD, signal.SIG_IGN)

四、CentOS 特殊注意点

CentOS 6

  • init(SysV)会回收孤儿进程

CentOS 7 / 8 / Stream

  • systemd(PID 1)会回收
  • 如果是 systemd 服务自己产生僵尸,通常是服务 bug

五、大量僵尸进程的常见场景

场景 说明
crontab 脚本 脚本 fork 后未等待
shell 脚本 后台 &wait
Java / Python 服务 调用外部命令未回收
docker / exec 容器 init 不健全

六、总结一句话

僵尸进程不能直接 kill,只能让其父进程退出或由 systemd 回收。

如果你愿意,可以贴出:

  • ps -ef | grep defunct 输出
  • 或父进程是什么服务

我可以帮你具体分析该怎么处理。

0