温馨提示×

centos僵尸进程是什么鬼

小樊
46
2026-10-20 19:39:58
栏目: 智能运维

在 CentOS(其实所有 Linux 都一样)里,僵尸进程(Zombie Process)并不是一个“中邪”的东西,而是 Linux 进程机制里的一种正常但需要注意的状态。


一、僵尸进程到底是什么?

简单说:

僵尸进程 = 已经死掉的进程,但还没被父进程“收尸”

当一个进程:

  1. 执行完毕或退出
  2. 但 它的父进程没有调用 wait() / waitpid() 来回收它

这时候,这个进程就变成:

  • 不再占用 CPU
  • 不再占用内存
  • 只保留一个“进程号(PID)+ 退出状态”在进程表里

状态显示为:

STAT = Z

二、怎么看僵尸进程?

1️⃣ 用 ps 看

ps -ef | grep defunct

或

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

2️⃣ 看系统整体僵尸数

top

右上角会显示:

Tasks: 120 total, 1 zombie

三、僵尸进程有什么危害?

✅ 少量僵尸进程:基本无害
❌ 大量僵尸进程:有问题

危害包括:

  • 占满 PID 资源(PID 用光,新进程起不来)
  • 说明 父进程写得很烂或挂了
  • 可能是 程序 bug / 服务异常

四、为什么会产生僵尸进程?

常见原因:

1️⃣ 父进程没回收子进程

fork();
// 子进程 exit
// 父进程忘了 wait()

2️⃣ 父进程自己挂了,但没交给 init

  • 正常情况下:
    • 父进程死了 → 子进程被 init(PID 1)接管
    • init 会自动回收
  • 但如果:
    • 父进程是 非系统服务
    • 或容器环境(如 Docker)

就可能堆积


五、怎么干掉僵尸进程?

⚠️ 重点:你不能直接 kill 僵尸进程

kill -9 僵尸PID   # 没用

✅ 正确做法

✅ 方法 1:杀父进程(最常见)

ps -o ppid= -p 僵尸PID
kill -9 父PID

父进程死了,僵尸会被 init 接管并清理


✅ 方法 2:重启相关服务

systemctl restart xxx

✅ 方法 3:写代码时避免(开发角度)

  • 父进程使用:
signal(SIGCHLD, SIG_IGN);

或

waitpid(-1, NULL, WNOHANG);

六、CentOS 常见“僵尸重灾区”

  • Java 程序 Runtime.exec()
  • Shell 脚本里疯狂 &
  • 老版本 Nginx / PHP-FPM 配置不当
  • Docker 容器里 PID 1 进程写得差

七、一句话总结

僵尸进程不是病毒,是“爹不收尸”的进程
少量没事,一堆就查父进程

如果你愿意,可以把 ps 输出贴出来,我帮你直接看是哪个服务在“养僵尸”。

0 踩