0

0

Linux 孤儿进程为何不会拖垮系统

舞夢輝影

舞夢輝影

发布时间:2026-01-30 21:23:02

|

339人浏览过

|

来源于php中文网

原创

孤儿进程被 PID 1 的 init 进程(或 systemd)收养;内核在父进程退出时硬编码将其 ppid 改为 1,确保所有顶层孤儿均由 PID 1 管理,且 init 仅负责退出后的资源回收,不干预运行状态。

linux 孤儿进程为何不会拖垮系统

孤儿进程被谁收养?内核硬编码保障

孤儿进程不会拖垮系统,根本原因是 Linux 内核在子进程父进程退出的瞬间,就强制将其 ppid 改为 1 —— 也就是 PID 为 1 的 init 进程(现代系统多为 systemd,但依然以 PID 1 身份运行)。这不是可选行为,而是内核路径中硬编码的逻辑:exit_notify() 函数里直接调用 forget_original_parent(),再通过 find_new_reaper() 指定新父进程为 PID 1。

这意味着:你无法绕过它。即使你用 prctl(PR_SET_CHILD_SUBREAPER, 1) 让某个普通进程当 subreaper,它也只能收养自己直系后代的孤儿,而**所有顶层孤儿(即原父进程非 subreaper)仍归 PID 1 管**。

init 只做“善后”,不干涉运行

很多人误以为 init 会“接管”孤儿进程的执行——其实完全不会。init 唯一做的就是等它退出后调用 waitpid(-1, NULL, WNOHANG) 回收资源。只要孤儿进程还在跑(比如一个长期运行的守护进程),init 就只是安静地当个名义上的“养父”,不发信号、不改调度、不重定向 stdin/stdout。

  • 孤儿进程继续按原优先级、原 cgroup、原用户权限运行
  • 它的文件描述符、内存、信号掩码全都不变
  • init 不会主动 kill 它,也不会尝试读写它的管道或 socket

为什么桌面版 Ubuntu 看不到 ppid=1?

在较新桌面版 Ubuntu(如 22.04+ GNOME)中,你用 ps 查孤儿进程可能发现 PPID 不是 1,而是某个 session manager(如 gnome-session-binary)。这不是 bug,而是因为 systemd 启用了 Delegate=yes + 用户实例(user@.service)机制,让每个登录会话有自己的 subreaper 层级。此时真正收养的是该 session 的 manager,而非全局 PID 1 —— 但最终,这些 manager 自己仍是 PID 1 的子进程,资源回收链没断。

Pixso AI
Pixso AI

Pixso AI是一款智能生成设计稿工具,通过AI一键实现文本输入到设计稿生成。

下载

验证方法:用 ps -o pid,ppid,comm -p $PID 追一层父进程,大概率能看到它最终挂在 systemd --user 下,而后者又挂在 PID 1 的 systemd 下。

真正危险的不是孤儿,而是没回收的僵尸

孤儿进程本身不占资源;真正拖垮系统的,是大量未被回收的僵尸进程(Z 状态)。而孤儿进程恰恰**降低了僵尸风险**:因为 init 会定期轮询,只要它一退出,init 就立刻 wait() 掉它,释放 PID、内存页、打开的 fd 等。相比之下,如果父进程活着却忘了 waitpid(),子进程退出后就会卡在 Z 状态,直到父进程死亡或显式回收。

所以,与其担心孤儿,不如检查你的服务进程是否漏调 waitpid() 或设了 SIGCHLD handler 却没调 wait() —— 那才是僵尸温床。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

237

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

316

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

752

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

93

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

316

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

752

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

93

2025.08.19

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.1万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号