centos僵尸进程是怎么来的
导读:CentOS 僵尸进程的产生机制 在 Linux/CentOS 中,僵尸进程是指子进程已调用 exit( 退出,但父进程尚未调用 wait/waitpid 回收其退出状态,导致该子进程的 PID/退出状态/运行时间 等仍残留在进程表中,状...
CentOS 僵尸进程的产生机制
在 Linux/CentOS 中,僵尸进程是指子进程已调用 exit() 退出,但父进程尚未调用 wait/waitpid 回收其退出状态,导致该子进程的 PID/退出状态/运行时间 等仍残留在进程表中,状态显示为 Z/defunct。它不再占用 CPU 或内存进行计算,但会占用一个 进程表 条目;当数量过多时,可能耗尽 PID/进程表项,使系统无法再创建新进程。需要注意的是,僵尸进程通常只保留进程表项,不会继续占用其他运行资源。
典型成因
- 父进程未回收子进程:子进程退出后发送 SIGCHLD,若父进程没有安装信号处理器并调用 wait/waitpid 读取退出状态,子进程就会变为僵尸。
- 信号被忽略或未正确等待:父进程忽略 SIGCHLD,或以错误方式处理(如只忽略但未真正回收),也会导致僵尸。
- 事件循环阻塞回收:使用 signalfd 等方式处理信号,但父进程卡在 epoll 等其他事件处理中,未能及时回收。
- 编程/逻辑缺陷:并发场景下忘记回收、回收不及时或遗漏某些子进程。
- 父进程异常退出:若父进程先于子进程退出且未妥善处理,子进程会被 PID 1(如 systemd)收养并回收;但若父进程已退出而子进程在变为僵尸后才被收养,仍需要由新的父进程(如 systemd)执行回收,否则会短暂残留。
以上情形在 CentOS 环境中同样适用。
识别与影响
- 识别方式:
- 运行 top,查看头部 Tasks 行的 zombie 计数;
- 使用 ps -eo pid,ppid,stat,cmd | awk ‘$3 ~ /Z/ { print} ’ 查找状态为 Z 或命令行中带有 defunct 的进程。
- 主要影响:
- 占用有限的 进程表/PID,大量僵尸会导致新进程创建失败;
- 单个僵尸本身几乎不占 CPU/内存,但整体数量大时会引发调度与稳定性问题。
这些现象在 CentOS 7/8 等版本中均一致。
处理与预防要点
- 不能“杀死”僵尸:对僵尸进程执行 kill -9 无效,因为它已退出;必须让其父进程调用 wait/waitpid 回收,或终止父进程使其被 PID 1 收养并回收。
- 正确做法:
- 在父进程中为 SIGCHLD 安装处理器,在处理函数中用 waitpid(WNOHANG) 循环回收所有已终止子进程;
- 若确实不关心子进程退出状态,可在程序初始化时使用 signal(SIGCHLD, SIG_IGN)(部分系统/库支持)让内核直接回收;
- 采用“两次 fork”技巧:父进程 fork 出子进程后,子进程再 fork 一个孙进程并立刻退出,由 PID 1 收养孙进程,父进程只负责回收第一个子进程;
- 运维侧可定位并重启/终止“僵尸的父进程”,以触发由 systemd 回收其僵尸后代。
以上方法是处理与预防僵尸的通用、有效手段。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: centos僵尸进程是怎么来的
本文地址: https://pptw.com/jishu/786008.html
