Linux系统-僵尸&孤儿进程

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

这是Linux进阶部分的最后一大章。讲完这一章以后,我们Linux进阶部分讲完以后,我们的Linux操作部分就算讲完了,后面的讲解就主要是Linux上的应用软件的讲解,包括虚拟化,容器,云原生,数据库,中间件等。Linux系统相关内容,主要从以下几个方面来讲解:

Linux系统-开关机

Linux系统-单用户模式

Linux系统-救援模式

Linux系统-僵尸&孤儿进程(本章节)

Linux系统-systemd

Linux系统-logrotate

Linux系统-发行版介绍

Linux系统-发行版rocky

Linux系统-发行版ubuntu

Linux系统-初始化

我们在讲Linux进阶命令-top的时候说过,在top里面命令,是可以看到僵尸进程的数量的;在讲Linux进阶命令-ps&kill的时候也讲过,部分进程是无法通过kill -9杀死的,僵尸进程就是其中之一;那么什么是僵尸进程,什么是孤儿进程的呢?

僵尸进程

僵尸进程是指一个已经结束执行(通常是父进程尚未对其执行wait系统调用)的进程,但在进程表中仍有其条目,占用系统资源。

一、产生原因

  1. 子进程先于父进程结束:当子进程结束时,它会向父进程发送一个信号,告知自己已经终止。然而,如果父进程没有及时处理这个信号(通过调用wait或waitpid函数),子进程就会进入僵尸状态。

  2. 父进程未正确处理子进程的结束:父进程可能因为忙于其他任务或者设计缺陷,没有及时处理子进程的结束状态,导致子进程成为僵尸进程。

二、影响

  1. 资源占用:僵尸进程会占用进程表中的一个条目,消耗一定的系统内存资源。虽然单个僵尸进程占用的资源通常较少,但如果系统中存在大量的僵尸进程,可能会导致进程表资源耗尽,影响系统的性能和稳定性。

  2. 系统管理困难:僵尸进程的存在会使系统管理员难以准确了解系统中正在运行的进程状态,增加了系统管理的复杂性。

三、解决方法

  1. 父进程正确处理子进程的结束:父进程应该及时调用wait或waitpid函数来处理子进程的结束状态,回收子进程的资源。这可以确保子进程在结束后不会成为僵尸进程。

  2. 使用信号处理:父进程可以设置信号处理函数来捕获子进程结束时发送的信号,然后在信号处理函数中调用wait或waitpid函数来处理子进程的结束状态。

  3. 重启父进程:如果父进程无法正确处理子进程的结束状态,可以考虑重启父进程。这将导致所有的子进程被终止,由系统自动回收它们的资源,从而消除僵尸进程。(简单来说就是结束父进程)。

四、案例

python 复制代码
import os
import time

pid = os.fork()
if pid == 0:
    # 子进程
    print(f'子进程:我的 PID 是 {os.getpid()}')
    os._exit(0)
else:
    # 父进程
    print(f'父进程:我的 PID 是 {os.getpid()},子进程 PID 是 {pid}')
    time.sleep(110)

查看僵尸进程的命令。

bash 复制代码
ps -eo pid,ppid,stat,cmd | awk '$3~/^Z/{print}'

孤儿进程

孤儿进程是指在其父进程结束后仍在运行的子进程。

一、产生过程

  1. 当一个父进程创建了一个子进程后,如果父进程在子进程还在运行时意外终止,那么这个子进程就会成为孤儿进程。

  2. 例如,父进程可能因为程序错误、被强制终止或者正常结束但忘记等待子进程等原因而先于子进程结束。

二、系统处理方式

  1. 当一个进程成为孤儿进程后,系统中的 init 进程(进程号为 1)会自动成为该孤儿进程的新父进程。

  2. init 进程会负责监控和清理孤儿进程。当孤儿进程结束时,init 进程会回收其占用的资源。

三、影响

  1. 通常情况下,孤儿进程不会对系统造成严重的不良影响。因为 init 进程会接管它们,确保资源得到合理的回收。

  2. 但是,如果系统中存在大量的孤儿进程,可能会消耗一定的系统资源,尤其是在创建和回收进程的过程中会产生一些开销。

四、案例

python 复制代码
import multiprocessing
import time
from flask import Flask

app = Flask(__name__)

def web_service():
    try:
        app.run()
    except KeyboardInterrupt:
        pass

if __name__ == '__main__':
    child_process = multiprocessing.Process(target=web_service)
    child_process.start()
    time.sleep(15)
    print("主进程退出。")
    # 主进程退出时不影响子进程继续运行
    multiprocessing.active_children()
    import os
    os._exit(0)

正常运行情况

形成孤儿进程

19414进程原来是19410的子进程,现在19410结束了,现在他被init 1号进程接管,他还继续运行。

这个时候,还可以继续提供服务,但是我们无法通过主进程来停止子进程,因为父进程已经结束,就只能通过kill命令来关闭他。

总结

  1. 僵尸进程是已经结束但父进程未回收其资源的进程,而孤儿进程是父进程已结束但自身仍在运行的进程。

  2. 僵尸进程不会占用cpu和内存资源,但是他会占用进程表资源,而孤儿进程会被 init 进程接管,他会继续提供服务。

  3. 一般而言,僵尸进程数量较少的情况我们不需要关注,但是需要知道它是由谁产生的。而孤儿进程由于他在继续提供服务,我们平时都可能较少关注到他。

运维小路

一个不会开发的运维!一个要学开发的运维!一个学不会开发的运维!欢迎大家骚扰的运维!

关注微信公众号《运维小路》获取更多内容。

相关推荐
skywalk81635 小时前
在FreeBSD系统的linux仿真环境下安装和使用kiro 这个亚马逊的AI agent
linux·人工智能·freebsd·kiro
Mikko75 小时前
Linux 磁盘满了但 du 找不到?LVM 扩容 df 不变?fstab 写错开不了机?三台真机实测磁盘排查
linux·运维·centos
蓝胖的四次元口袋5 小时前
Jenkins知识梳理(2)
运维·jenkins
yumgpkpm5 小时前
Acceldata ODP 3.3.6.4 vs CDP Private Cloud Base 7.3.2 对比
大数据·运维·服务器·hadoop·华为·zookeeper·hbase
Madison-No75 小时前
多语言聊天大模型--测试报告
linux·git·python·selenium·jmeter·自动化·postman
Liuqy-055 小时前
特殊进程——孤儿、僵尸、守护进程
linux·运维·服务器
流浪0015 小时前
Linux系统篇47——线程(十二) POSIX 信号量与环形队列,把判空判满提前到访问之前
linux·操作系统·线程·信号量·环形队列
咖丨喱6 小时前
【MMC Core + hc16 Host(WiFi SDIO 如何落到控制器)】
linux
等我调个Bug6 小时前
【Linux系统篇】权限
linux·服务器
考研保研资料分享6 小时前
自动化控制保研经验合辑:上交夏令营、北工大预推免与跨专业面试复盘(2025)
运维·面试·自动化