在 CentOS(以及所有 Linux 系统)中,僵尸进程(Zombie Process)本身并不是由某个“用户或程序主动创建”的,而是由操作系统在内核中生成的,但它的出现与父进程的行为直接相关。
下面分层说明:
一、僵尸进程是谁“创建”的?
1. 从内核角度看
- 僵尸进程是 Linux 内核创建的
- 当子进程**退出(exit)**后:
- 进程占用的资源(内存、文件等)已释放
- 但 PCB(进程控制块)仍保留
- 状态变为
Z(zombie)
- 目的:保留退出码,等待父进程读取
✅ 所以:僵尸进程是内核为“已死但未回收的子进程”保留的状态
2. 从进程关系看(真正责任方)
僵尸进程由 父进程“造成”的
- 子进程退出
- 父进程:
- 没有调用
wait() / waitpid()
- 或信号
SIGCHLD 被忽略
- 子进程就会一直僵尸
✅ 所以:僵尸进程是“父进程不回收子进程”的结果
二、CentOS 中常见的“父进程”是谁?
常见情况
| 场景 |
父进程示例 |
| 普通程序 |
bash、python、java |
| 服务进程 |
systemd、httpd、nginx |
| 守护进程 |
自己 fork 后没 wait |
| 写错的代码 |
多线程 / 多进程程序 |
三、为什么 CentOS 上常见僵尸进程?
1. systemd 作为 1 号进程
- CentOS 7+ 使用
systemd
- 所有服务最终父进程是
systemd
- 若服务程序不回收子进程 → 僵尸由 systemd 接管
2. 程序 bug
- fork 后没有 wait
- 信号屏蔽或忽略
SIGCHLD
四、僵尸进程“是谁创建的”一句话总结
僵尸进程是 Linux 内核在子进程退出后创建的,但根本原因是父进程没有回收它。
换句话说:
- 创建者:内核
- 责任人:父进程
- 在 CentOS 上:通常是某个服务或其父进程(如 systemd)
如果你愿意,我可以:
- 帮你 查看当前 CentOS 僵尸进程及父进程
- 分析 具体某个僵尸进程的来源
- 教你 如何避免 / 清理僵尸进程
只要告诉我你的使用场景即可。