0

0

Linux 系统进程僵尸与孤儿处理

舞夢輝影

舞夢輝影

发布时间:2026-02-16 15:01:01

|

708人浏览过

|

来源于php中文网

原创

僵尸进程需用ps aux | grep ' z '定位,其父进程若未调用wait()则需重启父进程或发sigchld信号;孤儿进程由systemd收养但不自动清理,容器中须用tini等init进程避免僵尸堆积。

linux 系统进程僵尸与孤儿处理

僵尸进程怎么查和清理

僵尸进程本身已死,只留内核里的一个 task_struct 条目,不占 CPU、内存,但会卡住进程 ID 和少量内核资源。它无法被 kill 命令干掉,强行发信号没用。

常见错误现象:ps aux 里看到状态为 Z 的进程;top 右上角显示 Z 数量持续不降;父进程长期不调用 wait()waitpid() 是根本原因。

  • 先用 ps aux | grep ' Z 'ps aux --forest | grep 'Z' 定位僵尸进程及其父进程 PID(看 PPID 列)
  • 检查父进程是否还在运行:如果父进程已退出,init(PID 1)或 systemd 通常会自动收养并清理——但某些容器环境或自定义 init 里可能不会
  • 若父进程仍在且写法有缺陷(比如没处理子进程退出信号),只能重启父进程;别试 kill -9 僵尸进程,它早死了
  • 极端情况可尝试向父进程发 SIGCHLDkill -s SIGCHLD <ppid></ppid>,部分父进程会因此触发 wait()

孤儿进程谁来收养?systemd 下表现异常吗

孤儿进程指父进程先于子进程退出,按 POSIX 规定,这类进程会被 init 进程(传统是 PID 1 的 init,现代多数是 systemd)收养。收养后,它的 PPID 变成 1,继续运行不受影响。

关键点在于:收养 ≠ 清理。systemd 收养后不会主动等它退出,也不会自动回收其退出状态——所以如果该孤儿进程后来变成僵尸,而 systemd 没调用 wait(),它就真卡住了。

  • 验证是否被收养:查 ps -o pid,ppid,comm -p <pid></pid>,PPID 是 1 就说明已被收养
  • systemd 默认行为是“不干预”,除非该进程是它直接启动的服务(即通过 .service 文件启动)。这种情况下,systemd 会监控生命周期并自动 wait
  • 在 shell 脚本中后台启动的子进程(如 sleep 100 &),若父 shell 退出,该 sleep 成为孤儿并被 systemd 收养,但没人等它——100 秒后它退出,就会变成僵尸,直到 systemd 下次做清理(实际依赖具体版本和配置)
  • 避免方式:脚本里用 wait 显式等待,或用 setsid 让子进程彻底脱离会话(如 setsid sleep 100 &

fork 后不 wait 的典型代码坑

C/C++ 里 fork() 创建子进程后,若父进程不调用 wait()waitpid() 获取子进程退出状态,子进程终止后必然变成僵尸。这不是 bug,是 Unix 设计使然——内核必须保留退出码等信息,等父进程来取。

Pixlr Remove BG
Pixlr Remove BG

几秒钟删除图片背景

下载

容易被忽略的是:即使父进程忘了 wait,只要它后续正常退出,init/systemd 会收养并最终清理所有子进程(包括已僵尸的)。但若父进程长年运行(比如守护进程、服务程序),这些僵尸就一直挂着。

  • 信号处理是常见疏漏点:注册 SIGCHLD 处理函数时,必须在 handler 里循环调用 waitpid(-1, &status, WNOHANG),否则一次只清理一个子进程,多个子退出时仍有漏网之鱼
  • wait()waitpid() 参数差异:前者阻塞等待任意子进程,后者可指定 PID 或用 -1 等价于 wait();加 WNOHANG 标志才能非阻塞轮询
  • 多线程程序中,只有创建子进程的那个线程能 wait 它;其他线程调用会失败(errno = ECHILD
  • Go/Python 等高级语言通常封装了这一层,但用 os.fork()syscall.ForkExec() 时,仍需手动处理,不能依赖 runtime 自动 wait

容器里僵尸进程为什么特别难搞

容器默认 PID namespace 隔离,init 进程(PID 1)不是宿主机的 systemd,而是你镜像里启动的第一个进程。如果它不处理子进程退出(比如用 /bin/sh 直接跑命令,而非用 tinisupervisord),所有子进程退出后都会变成僵尸,且永远没人收养。

现象比宿主机更明显:ps 看到一堆 Zdocker stats 显示进程数持续上涨,但 CPU/内存无变化;kill -9 宿主机上对应容器的 PID 没用,因为那只是宿主机视角的 pause 进程。

  • 根本解法:容器入口进程必须是真正的 init,推荐用 tini(Docker 官方支持)或 docker run --init 启动
  • 自己写启动脚本时,避免直接 exec $@;应先启动 tini,再让它执行主程序:exec tini -- $@
  • Alpine 镜像里默认没有 tini,要手动 apk add --no-cache tini 并设为 ENTRYPOINT
  • Kubernetes 中可通过 securityContext.procMount: "default" 和启用 initContainers 辅助清理,但不如从镜像源头解决干净

真正麻烦的从来不是单个僵尸,而是父进程逻辑里混着信号处理、多线程、容器化部署这三者的组合——这时候 wait 调用位置、时机、是否循环,全得抠到系统调用层面才敢说稳了。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

417

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

589

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

674

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

346

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

24

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

96

2026.02.06

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

229

2023.12.07

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

热门下载

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

精品课程

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

共48课时 | 9.1万人学习

Git 教程
Git 教程

共21课时 | 3.6万人学习

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

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