linux如何查看僵尸进程

 更新时间:2023年03月23日 10:05:19   作者:代元培  
这篇文章主要介绍了linux如何查看僵尸进程问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

linux查看僵尸进程

1、查看系统是否有僵尸进程

使用Top命令查找,当zombie前的数量不为0时,即系统内存在相应数量的僵尸进程。

linux查看僵尸进程
 

2、定位僵尸进程

使用命令ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'定位僵尸进程以及该僵尸进程的父进程。

3、杀死僵尸进程

使用Kill -HUP 僵尸进程ID来杀死僵尸进程,往往此种情况无法杀死僵尸进程,此时就需要杀死僵尸进程的父进程。

kill -HUP 僵尸进程父ID

然后使用上面第二步的语句查询该僵尸进程是否被杀死。

4、参数解读

ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'

-A  参数列出所有进程

-o  自定义输出字段 stat(状态)、ppid(进程父id)、pid(进程id)、cmd(命令)

因为状态为z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程

linux僵尸进程及僵尸进程的处理

僵尸进程

(1)进程中的指令已经执行完成,但是进程PCB结构还没有回收。

即子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程。

(2)父进程未结束,子进程结束,但父进程没有处理子进程的退出状态(当子进程先于父进程结束,父进程没有获取子进程的退出码,子进程的PCB会保留一段时间等待父进程在PCB中获取退出码,,且该进程不可执行,此时子进程变成僵尸进程)。

直到父进程获取到子进程的退出状态,子进程的PCB才会被移除。

我们的程序在退出的时候:return 0,exit(0),这个0就是退出码(状态信息),它存储在当前进程的PCB中,会有一个整型值来存储退出码。

当我们子进程结束以后,会把退出码写到PCB中,然后希望父进程可以获得到这个退出码,然后父进程就可以看到子进程是正常运行结束还是出错退出。正常的话我们return 0,失败的话我们return -1。

模拟僵尸进程:

在这里插入图片描述

僵死进程产生了,会有什么影响?

  • 如果只有一两个僵死进程,没有什么影响。
  • 如果有很多个僵死进程,持续不断的产生,就有影响了,因为子进程的PCB如果没有被释放,进程的PID就被一直占着,在内核空间中,PCB本身是结构体,会占用内存空间,对系统软硬件资源损耗,因此我们要避免僵死进程的产生,父进程有义务去处理!

何处理僵尸进程

父进程调用wait()方法获取子进程的退出码,从而使得OS删除子进程的PCB;

父进程先结束(该子进程就失去了父进程,系统会将这种没有子进程的父进程当做孤儿进程OS会给该孤儿进程重新寻找一个父进程Init进程,其PID == 1,通常会收养那些没有父进程的子进程,就会直接获取其退出码从而消除该进程的僵死状态 [ 其内部其实也是调用了wait()方法] )

如下图所示,修改之前的代码,让父进程先于子进程结束

在这里插入图片描述

执行结果如下:

在这里插入图片描述

我们可以看到失去父进程的子进程的PPID变为1,也就是Init进程

在这里插入图片描述

父进程处理子进程退出状态(退出码)的方法

pid_t wait(int *result)//获取调用此方法的进程的子进程的退出码
  • 如果没有子进程,则调用失败;
  • 如果有子进程并且已经结束,则返回子进程的PID,退出码在result带回。
  • 如果子进程没有结束,那么wait就会阻塞等待子进程结束。

我们来看一下wait的参考手册:

在这里插入图片描述

我们需要传入一个整形变量的地址,它会将退出码写到该地址中,返回值就是他获取到退出码的那个子进程的PID。

在这里插入图片描述

执行结果如下:这样就相当于父子进程是串行执行的,因此我们不会很简单粗暴地调用wait(),失去了多进程执行的意义,常会使用一些巧妙的方法,比如配合信号使用,这个在后面的博客中将会提到。

出现这种现象的原因是:父进程需要获取子进程的退出码,就需要等待子进程先结束,既然子进程没有结束,就无法获取子进程的退出码,wait()方法就相当于阻塞了父进程的运行。

在这里插入图片描述

如果有多个子进程,一次wait调用只能处理一个子进程(最先结束的哪一个)。

如下代码也用wait处理了僵尸进程,但我们需要解决另外一个问题:

注意:此时我们exit(0)的退出码是0

在这里插入图片描述

此时val的值为0

在这里插入图片描述

但是当我们将退出码改为3时,执行结果发生了变化,我们可以看到val = 768

在这里插入图片描述

这是为什么呢?

其实768对应的二进制数为0011 0000 0000,(11就是那个3)

——左移了8位,因为退出码一般来说是128以内的值,但是一个整型有4字节,1个字节本来就够存储退出码了,其他3个字节有别的作用了,所以在这里就发现被移位了,存储在该存储的位上。我们这怎么处理?

操作位是不大方便的,但是系统给我们提供了一些方法

  • 第一个宏是用来判断程序是否是正常exit退出
  • 如果是正常退出,就通过第二个宏得出退出码,这个宏就知道我们的退出码是在4个字节中的哪个字节存放的,精准取值,此时拿到的就是我们设定的3了,不是768了。

在这里插入图片描述

当程序还没有执行到exit就被杀死,获取到异常终止的信号,我们就用下面这个宏来判断

在这里插入图片描述

使用宏后,我们修改代码如下:

在这里插入图片描述

之后就可以看到正常的执行结果了

在这里插入图片描述

wait调用的最佳时机:子进程退出的那一时刻,父进程调用wait;

这里引入一个概念,在下一期Linux专栏将会讲到信号

若在父进程一开始就调用,那么就会出现串行执行的效果;

若在父进程快要结束的时候调用,那么父进程已经退出,处理僵尸进程就没有意义了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vim的一些常用简单操作小结

    vim的一些常用简单操作小结

    大家都知道vim在Linux下使用很多,但是习惯了在Windows下的文本操作,在vim中进行文本操作会觉得很不方便,但是vim是一个很强大的工具,只是还不熟练去使用它,下面是一些常用的vim文本操作方法。
    2016-09-09
  • Linux多块硬盘如何挂载到同一目录

    Linux多块硬盘如何挂载到同一目录

    文章介绍了如何使用LVM(逻辑卷管理)将多块硬盘合并为一个逻辑卷,并详细描述了操作流程,包括创建物理卷、卷组和逻辑卷,以及格式化和挂载逻辑卷
    2025-02-02
  • Flume环境部署和配置详解及案例大全

    Flume环境部署和配置详解及案例大全

    flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。支持在日志系统中定制各类数据发送方,用于收集数据;同时,Flume提供对数据进行简单处理,并写到各种数据接受方(比如文本、HDFS、Hbase等)的能力 。
    2014-08-08
  • linux下cpu飙高原因排查过程详解

    linux下cpu飙高原因排查过程详解

    大家好,本篇文章主要讲的是linux下cpu飙高原因排查过程详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦
    2021-11-11
  • CentOS下停止Tomcat运行脚本代码

    CentOS下停止Tomcat运行脚本代码

    这篇文章主要介绍了CentOS下停止Tomcat运行脚本代码,需要的朋友可以参考下
    2014-11-11
  • Ubuntu配置静态IP的两种方法

    Ubuntu配置静态IP的两种方法

    在本教程中,您将了解有关 Ubuntu 静态 IP 地址配置的所有信息,我们将为读者Ubuntu配置静态IP的两种方法以及详细的配置过程,通过图文介绍的非常详细,需要的朋友可以参考下
    2024-10-10
  • Apache与Tomcat服务器整合的基本配置方法及概要说明

    Apache与Tomcat服务器整合的基本配置方法及概要说明

    网上的乱七八糟的资料太多了,很多都是自说自话,希望这篇文章能给大家带来一些清晰的思路。
    2010-12-12
  • linux系统终端修改字体的方法

    linux系统终端修改字体的方法

    我们以debian为例,介绍两种linux修改终端字体的设置方法,大家参考使用吧
    2014-01-01
  • 致命的7个Linux命令

    致命的7个Linux命令

    如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避免在系统中运行它们
    2014-03-03
  • Linux如何搭建文件服务器

    Linux如何搭建文件服务器

    这篇文章主要介绍了Linux如何搭建文件服务器,包括基于centos7.9搭建http文件服务器,基于centos7.9搭建nginx文件服务器以及基于ubuntu2204搭建http文件服务器,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-10-10

最新评论