温馨提示×

centos僵尸进程是什么原理

小樊
35
2026-09-03 05:38:33
栏目: 智能运维

在 CentOS(以及所有类 Unix / Linux 系统)中,僵尸进程(Zombie Process)本质上是进程已经结束,但父进程还没有回收它的退出状态时的一种“残留状态”。

下面从原理上给你讲清楚。


一、进程结束的正常流程

在 Linux 中,一个进程结束时会经历这些步骤:

  1. 子进程调用 exit() 或收到终止信号
  2. 内核释放该进程的大部分资源(内存、文件描述符等)
  3. 保留一小部分信息
    • 进程号(PID)
    • 退出状态码(exit status)
    • 进程运行状态(僵尸状态)
  4. 父进程调用 wait() / waitpid() 回收子进程
  5. 内核彻底删除该进程表项

✅ 如果父进程及时 wait(),就不会有僵尸进程。


二、什么是僵尸进程

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

ps 中表现为:

ps -ef

状态列显示:

Z

Z+(僵尸+前台)

例如:

user1   12345  12340  0 10:00 ?  00:00:00 [myapp] <defunct>

<defunct> 就是僵尸。


三、僵尸进程为什么会产生

1️⃣ 父进程没有调用 wait()

最常见原因,比如:

fork();
// 子进程 exit
// 父进程一直跑,不 wait

2️⃣ 父进程忙于其他事,没空回收

例如:

  • 父进程死循环
  • 父进程被阻塞(IO、锁)

3️⃣ 父进程逻辑错误

  • 忘了 wait
  • wait 一次,但创建了多个子进程

4️⃣ 父进程异常

  • 父进程崩溃
  • 父进程被 kill -9

注意:如果父进程死了,子进程会被 init(PID 1)收养,init 会自动 wait,一般不会长期僵尸。


四、僵尸进程占什么资源?

不占 CPU不占内存占一个 PID

影响:

  • PID 耗尽(极端情况)
  • 系统进程表膨胀
  • 看起来“不干净”

五、为什么不能直接 kill 僵尸进程?

因为:

僵尸进程已经死了,kill 不了

kill -9 12345

无效。

只能:

  • 让父进程回收
  • 杀掉父进程(让 init 接管)

六、CentOS 中常见处理方式

1️⃣ 找到父进程

ps -o pid,ppid,stat,cmd -p 僵尸PID

2️⃣ 杀掉父进程(最后手段)

kill -9 父进程PID

僵尸会被 systemd(PID 1)回收。

3️⃣ 编程中正确避免

signal(SIGCHLD, SIG_IGN);

或:

while (waitpid(-1, NULL, WNOHANG) > 0);

七、一句话总结

CentOS 僵尸进程的本质是:子进程已死,父进程未 wait,内核保留 PID 和退出状态。

如果你愿意,我也可以:

  • C 代码演示僵尸进程
  • systemd 下僵尸处理机制
  • 分析你服务器上具体的僵尸进程场景

0