广告
返回顶部
首页 > 资讯 > 操作系统 >linux如何查看僵尸进程
  • 667
分享到

linux如何查看僵尸进程

linux查看僵尸进程linux僵尸进程查看僵尸进程 2023-03-23 09:03:05 667人浏览 安东尼
摘要

目录linux查看僵尸进程linux僵尸进程及僵尸进程的处理僵尸进程何处理僵尸进程父进程处理子进程退出状态(退出码)的方法总结linux查看僵尸进程 1、查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量

目录
  • linux查看僵尸进程
  • 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退出
    • 如果是正常退出,就通过第二个宏得出退出码,

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

    在这里插入图片描述

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

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

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

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

    总结

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

    --结束END--

    本文标题: linux如何查看僵尸进程

    本文链接: https://www.lsjlt.com/news/200972.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • linux如何查看僵尸进程
      目录linux查看僵尸进程linux僵尸进程及僵尸进程的处理僵尸进程何处理僵尸进程父进程处理子进程退出状态(退出码)的方法总结linux查看僵尸进程 1、查看系统是否有僵尸进程 使用Top命令查找,当zombie前的数量...
      99+
      2023-03-23
      linux查看僵尸进程 linux僵尸进程 查看僵尸进程
    • Linux系统中如何查看并杀死僵尸进程
      这篇文章主要为大家展示了Linux系统中如何查看并杀死僵尸进程,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“Linux系统中如何查看并杀死僵尸进程”这篇文章吧。僵尸进程是指一个已经终止、但是其父进...
      99+
      2023-06-28
    • Linux系统中如何查看并且杀死僵尸进程
      小编给大家分享一下Linux系统中如何查看并且杀死僵尸进程,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!僵尸进程就是是指一个已经终止、但是其父进程尚未对其进行善后处理获取终止进程的有关信息的进程,这个进程被称为“僵尸进程”...
      99+
      2023-06-28
    • Linux中如何处理僵尸进程
      这篇文章将为大家详细讲解有关Linux中如何处理僵尸进程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。僵尸进程(Zombie process)通俗来说指那些虽然已经终止的进程,但仍然保留一些信息,等待其父...
      99+
      2023-06-28
    • linux怎么杀僵尸进程
      在 Linux 中,可以使用 ps 和 kill 命令来杀死僵尸进程。 首先,使用 ps 命令查看当前系统中的进程,并找到僵尸进程的进程号(PID)。例如,在某些情况下,僵尸进程可能会在 STAT 列中显示为 Z,表示进程处于僵尸状态。...
      99+
      2023-09-01
      linux 运维 服务器 centos bash
    • Linux系统中怎么查杀僵尸进程
      本篇文章给大家分享的是有关Linux系统中怎么查杀僵尸进程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、如何查看僵尸进程如何查看linux系统上的僵尸进程,如何统计有多少僵...
      99+
      2023-06-12
    • linux僵尸进程怎么避免
      本文小编为大家详细介绍“linux僵尸进程怎么避免”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux僵尸进程怎么避免”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 ...
      99+
      2023-04-20
      linux
    • Linux下怎么杀死僵尸进程
      这篇文章将为大家详细讲解有关Linux下怎么杀死僵尸进程,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Linux 中的进程是什么?这一切始于执行 Linux 中的一个程序时,当它被执行时,它的运行实例被称...
      99+
      2023-06-27
    • Linux系统中查看并且杀死僵尸进程命令有哪些
      这篇“Linux系统中查看并且杀死僵尸进程命令有哪些”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“Linux系统中查看并且杀死僵尸进程命令有哪些”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望...
      99+
      2023-06-28
    • shell如何清除僵尸进程
      这篇文章给大家分享的是有关shell如何清除僵尸进程的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。清除僵尸进程代码如下:ps -eal | awk&...
      99+
      2022-10-19
    • linux僵尸进程的概念是什么
      本篇内容介绍了“linux僵尸进程的概念是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!linux僵尸进程是一个已经终止但是其父进程尚未...
      99+
      2023-07-02
    • 【Linux】进程状态(阻塞、挂起、僵尸进程)
      文章目录 1 阻塞与挂起1.1 阻塞1.2 挂起 2 进程状态 前言: 当我们在Windows下双击运行一个程序,或是在Linux下通过 ./ 加载运行一个程序,是否就代表对应的...
      99+
      2023-09-12
      linux 运维 服务器 进程状态 僵尸进程
    • Shell脚本实现查杀子进程、僵尸进程
      核心服务器上跑了一堆的脚本、程序,难免有时候会出现僵尸进程,死不死活不活的在那里占用资源,最初只是写了个根据关键字查杀进程的linux shell脚本,后来发现很多时候进程死在那里的时候其实是内部调用子进程...
      99+
      2022-06-04
      进程 僵尸 查杀
    • Shell中怎么查杀子进程和僵尸进程
      本篇文章给大家分享的是有关Shell中怎么查杀子进程和僵尸进程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。代码如下:#!/bin/sh# 递归找到导致进程僵死的最底层子进程并...
      99+
      2023-06-09
    • linux下僵尸进程的发现与处理
       僵尸进程是怎么产生的当子进程退出时,父进程没有调用wait函数或者waitpid()函数等待子进程结束,又没有显式忽略SIGCHLD信号,那么它将一直保持在僵尸状态,如果这时父进程结束了,init进程会自动接收这个子进程,为它收...
      99+
      2023-01-31
      僵尸 进程 发现
    • linux僵尸进程杀不死怎么解决
      今天小编给大家分享一下linux僵尸进程杀不死怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。linux僵尸进程杀不死...
      99+
      2023-06-30
    • 【Linux取经路】探索进程状态之僵尸进程 | 孤儿进程
      文章目录 一、进程状态概述1.1 运行状态详解1.2 阻塞状态详解1.3 挂起状态详解 二、具体的Linux操作系统中的进程状态2.1 Linux内核源代码2.2 查看进程状态2.3 D...
      99+
      2023-09-03
      linux 服务器 数据库 进程状态 运维
    • Linux后台开发中避免僵尸进程的方法是什么
      这篇文章主要介绍“Linux后台开发中避免僵尸进程的方法是什么”,在日常操作中,相信很多人在Linux后台开发中避免僵尸进程的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
      99+
      2022-10-19
    • 【看表情包学Linux】进程状态解析 | 运行态 | 终止态 | 进程挂起与阻塞 | 运行态R | 阻塞态S/D | 死亡态X | 僵尸态Z | 暂停态T/t | 僵尸进程 | 孤儿进程
        🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅  🔥  💭 写在前面:本章我们专门讲解进程的状态。我们先学习具体的 Linux 系统状态,再去介...
      99+
      2023-09-09
      linux 运维 服务器
    • linux如何查看进程
      linux查看进程的方法:1、打开终端;2、输入“ps aux”命令查看所有进程信息即可。具体操作步骤:首先通过快捷键【Ctrl+Alt+T】打开终端命令行模式。输入以下命令查看所有进程信息即可。ps aux#查看所有进程信息相关...
      99+
      2022-10-22
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作