欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

linux如何查看僵尸進(jìn)程

 更新時(shí)間:2023年03月23日 10:05:19   作者:代元培  
這篇文章主要介紹了linux如何查看僵尸進(jìn)程問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

linux查看僵尸進(jìn)程

1、查看系統(tǒng)是否有僵尸進(jìn)程

使用Top命令查找,當(dāng)zombie前的數(shù)量不為0時(shí),即系統(tǒng)內(nèi)存在相應(yīng)數(shù)量的僵尸進(jìn)程。

linux查看僵尸進(jìn)程
 

2、定位僵尸進(jìn)程

使用命令ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'定位僵尸進(jìn)程以及該僵尸進(jìn)程的父進(jìn)程。

3、殺死僵尸進(jìn)程

使用Kill -HUP 僵尸進(jìn)程ID來殺死僵尸進(jìn)程,往往此種情況無法殺死僵尸進(jìn)程,此時(shí)就需要?dú)⑺澜┦M(jìn)程的父進(jìn)程。

kill -HUP 僵尸進(jìn)程父ID

然后使用上面第二步的語句查詢?cè)摻┦M(jìn)程是否被殺死。

4、參數(shù)解讀

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

-A  參數(shù)列出所有進(jìn)程

-o  自定義輸出字段 stat(狀態(tài))、ppid(進(jìn)程父id)、pid(進(jìn)程id)、cmd(命令)

因?yàn)闋顟B(tài)為z或者Z的進(jìn)程為僵尸進(jìn)程,所以我們使用grep抓取stat狀態(tài)為zZ進(jìn)程

linux僵尸進(jìn)程及僵尸進(jìn)程的處理

僵尸進(jìn)程

(1)進(jìn)程中的指令已經(jīng)執(zhí)行完成,但是進(jìn)程PCB結(jié)構(gòu)還沒有回收。

即子進(jìn)程先于父進(jìn)程退出后,子進(jìn)程的PCB需要其父進(jìn)程釋放,但是父進(jìn)程并沒有釋放子進(jìn)程的PCB,這樣的子進(jìn)程就稱為僵尸進(jìn)程。

(2)父進(jìn)程未結(jié)束,子進(jìn)程結(jié)束,但父進(jìn)程沒有處理子進(jìn)程的退出狀態(tài)(當(dāng)子進(jìn)程先于父進(jìn)程結(jié)束,父進(jìn)程沒有獲取子進(jìn)程的退出碼,子進(jìn)程的PCB會(huì)保留一段時(shí)間等待父進(jìn)程在PCB中獲取退出碼,,且該進(jìn)程不可執(zhí)行,此時(shí)子進(jìn)程變成僵尸進(jìn)程)。

直到父進(jìn)程獲取到子進(jìn)程的退出狀態(tài),子進(jìn)程的PCB才會(huì)被移除。

我們的程序在退出的時(shí)候:return 0,exit(0),這個(gè)0就是退出碼(狀態(tài)信息),它存儲(chǔ)在當(dāng)前進(jìn)程的PCB中,會(huì)有一個(gè)整型值來存儲(chǔ)退出碼。

當(dāng)我們子進(jìn)程結(jié)束以后,會(huì)把退出碼寫到PCB中,然后希望父進(jìn)程可以獲得到這個(gè)退出碼,然后父進(jìn)程就可以看到子進(jìn)程是正常運(yùn)行結(jié)束還是出錯(cuò)退出。正常的話我們r(jià)eturn 0,失敗的話我們r(jià)eturn -1。

模擬僵尸進(jìn)程:

在這里插入圖片描述

僵死進(jìn)程產(chǎn)生了,會(huì)有什么影響?

  • 如果只有一兩個(gè)僵死進(jìn)程,沒有什么影響。
  • 如果有很多個(gè)僵死進(jìn)程,持續(xù)不斷的產(chǎn)生,就有影響了,因?yàn)樽舆M(jìn)程的PCB如果沒有被釋放,進(jìn)程的PID就被一直占著,在內(nèi)核空間中,PCB本身是結(jié)構(gòu)體,會(huì)占用內(nèi)存空間,對(duì)系統(tǒng)軟硬件資源損耗,因此我們要避免僵死進(jìn)程的產(chǎn)生,父進(jìn)程有義務(wù)去處理!

何處理僵尸進(jìn)程

父進(jìn)程調(diào)用wait()方法獲取子進(jìn)程的退出碼,從而使得OS刪除子進(jìn)程的PCB;

父進(jìn)程先結(jié)束(該子進(jìn)程就失去了父進(jìn)程,系統(tǒng)會(huì)將這種沒有子進(jìn)程的父進(jìn)程當(dāng)做孤兒進(jìn)程OS會(huì)給該孤兒進(jìn)程重新尋找一個(gè)父進(jìn)程Init進(jìn)程,其PID == 1,通常會(huì)收養(yǎng)那些沒有父進(jìn)程的子進(jìn)程,就會(huì)直接獲取其退出碼從而消除該進(jìn)程的僵死狀態(tài) [ 其內(nèi)部其實(shí)也是調(diào)用了wait()方法] )

如下圖所示,修改之前的代碼,讓父進(jìn)程先于子進(jìn)程結(jié)束

在這里插入圖片描述

執(zhí)行結(jié)果如下:

在這里插入圖片描述

我們可以看到失去父進(jìn)程的子進(jìn)程的PPID變?yōu)?,也就是Init進(jìn)程

在這里插入圖片描述

父進(jìn)程處理子進(jìn)程退出狀態(tài)(退出碼)的方法

pid_t wait(int *result)//獲取調(diào)用此方法的進(jìn)程的子進(jìn)程的退出碼
  • 如果沒有子進(jìn)程,則調(diào)用失?。?/li>
  • 如果有子進(jìn)程并且已經(jīng)結(jié)束,則返回子進(jìn)程的PID,退出碼在result帶回。
  • 如果子進(jìn)程沒有結(jié)束,那么wait就會(huì)阻塞等待子進(jìn)程結(jié)束。

我們來看一下wait的參考手冊(cè):

在這里插入圖片描述

我們需要傳入一個(gè)整形變量的地址,它會(huì)將退出碼寫到該地址中,返回值就是他獲取到退出碼的那個(gè)子進(jìn)程的PID。

在這里插入圖片描述

執(zhí)行結(jié)果如下:這樣就相當(dāng)于父子進(jìn)程是串行執(zhí)行的,因此我們不會(huì)很簡單粗暴地調(diào)用wait(),失去了多進(jìn)程執(zhí)行的意義,常會(huì)使用一些巧妙的方法,比如配合信號(hào)使用,這個(gè)在后面的博客中將會(huì)提到。

出現(xiàn)這種現(xiàn)象的原因是:父進(jìn)程需要獲取子進(jìn)程的退出碼,就需要等待子進(jìn)程先結(jié)束,既然子進(jìn)程沒有結(jié)束,就無法獲取子進(jìn)程的退出碼,wait()方法就相當(dāng)于阻塞了父進(jìn)程的運(yùn)行。

在這里插入圖片描述

如果有多個(gè)子進(jìn)程,一次wait調(diào)用只能處理一個(gè)子進(jìn)程(最先結(jié)束的哪一個(gè))。

如下代碼也用wait處理了僵尸進(jìn)程,但我們需要解決另外一個(gè)問題:

注意:此時(shí)我們exit(0)的退出碼是0

在這里插入圖片描述

此時(shí)val的值為0

在這里插入圖片描述

但是當(dāng)我們將退出碼改為3時(shí),執(zhí)行結(jié)果發(fā)生了變化,我們可以看到val = 768

在這里插入圖片描述

這是為什么呢?

其實(shí)768對(duì)應(yīng)的二進(jìn)制數(shù)為0011 0000 0000,(11就是那個(gè)3)

——左移了8位,因?yàn)橥顺龃a一般來說是128以內(nèi)的值,但是一個(gè)整型有4字節(jié),1個(gè)字節(jié)本來就夠存儲(chǔ)退出碼了,其他3個(gè)字節(jié)有別的作用了,所以在這里就發(fā)現(xiàn)被移位了,存儲(chǔ)在該存儲(chǔ)的位上。我們這怎么處理?

操作位是不大方便的,但是系統(tǒng)給我們提供了一些方法

  • 第一個(gè)宏是用來判斷程序是否是正常exit退出
  • 如果是正常退出,就通過第二個(gè)宏得出退出碼,這個(gè)宏就知道我們的退出碼是在4個(gè)字節(jié)中的哪個(gè)字節(jié)存放的,精準(zhǔn)取值,此時(shí)拿到的就是我們?cè)O(shè)定的3了,不是768了。

在這里插入圖片描述

當(dāng)程序還沒有執(zhí)行到exit就被殺死,獲取到異常終止的信號(hào),我們就用下面這個(gè)宏來判斷

在這里插入圖片描述

使用宏后,我們修改代碼如下:

在這里插入圖片描述

之后就可以看到正常的執(zhí)行結(jié)果了

在這里插入圖片描述

wait調(diào)用的最佳時(shí)機(jī):子進(jìn)程退出的那一時(shí)刻,父進(jìn)程調(diào)用wait;

這里引入一個(gè)概念,在下一期Linux專欄將會(huì)講到信號(hào)

若在父進(jìn)程一開始就調(diào)用,那么就會(huì)出現(xiàn)串行執(zhí)行的效果;

若在父進(jìn)程快要結(jié)束的時(shí)候調(diào)用,那么父進(jìn)程已經(jīng)退出,處理僵尸進(jìn)程就沒有意義了。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一文詳解Linux三種網(wǎng)絡(luò)設(shè)置方式

    一文詳解Linux三種網(wǎng)絡(luò)設(shè)置方式

    我們?cè)谑褂锰摂M機(jī)搭建linux系統(tǒng)后,常常需要設(shè)置系統(tǒng)網(wǎng)絡(luò)連接,以方便系統(tǒng)進(jìn)行上網(wǎng)或其他系統(tǒng)連接系統(tǒng)進(jìn)行操作,在linux中網(wǎng)絡(luò)連接分了三類:橋接模式,僅主機(jī)模式,NAT模式,本文我們將對(duì)這三種模式進(jìn)行講解,感興趣的同學(xué)可以參考閱讀
    2023-06-06
  • 在Linux中列出Systemd下所有正在運(yùn)行的服務(wù)的方法指南

    在Linux中列出Systemd下所有正在運(yùn)行的服務(wù)的方法指南

    Systemd是Linux的系統(tǒng)和服務(wù)管理器; init進(jìn)程的替代品,與SysV 和LSB init腳本兼容,systemctl命令是管理systemd的主要工具,在這篇文章中,我們將演示如何 Linux中列出systemd下所有正在運(yùn)行的服務(wù),感興趣的同學(xué)可以借鑒閱讀
    2023-06-06
  • Ubuntu使用國內(nèi)源出現(xiàn)Hash Sum mismatch錯(cuò)誤的解決

    Ubuntu使用國內(nèi)源出現(xiàn)Hash Sum mismatch錯(cuò)誤的解決

    這篇文章主要介紹了Ubuntu使用國內(nèi)源出現(xiàn)Hash Sum mismatch錯(cuò)誤的解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 判斷CC攻擊 netstat命令詳解

    判斷CC攻擊 netstat命令詳解

    判斷CC攻擊 netstat命令詳解,快速找出有問題的ip。
    2010-12-12
  • Linux內(nèi)核宏container_of的深度剖析

    Linux內(nèi)核宏container_of的深度剖析

    今天小編就為大家分享一篇關(guān)于Linux內(nèi)核宏container_of的深度剖析,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • linux服務(wù)器之LVS、Nginx和HAProxy負(fù)載均衡器對(duì)比總結(jié)

    linux服務(wù)器之LVS、Nginx和HAProxy負(fù)載均衡器對(duì)比總結(jié)

    這篇文章主要介紹了linux服務(wù)器之LVS、Nginx和HAProxy負(fù)載均衡器對(duì)比,需要的朋友可以參考下
    2014-03-03
  • Centos5給/根分區(qū)擴(kuò)容

    Centos5給/根分區(qū)擴(kuò)容

    今天在調(diào)整VPS的時(shí)候發(fā)現(xiàn)自己的/分區(qū)的空間用光了.但是還剩下一個(gè)分區(qū)hda3沒動(dòng).于是乎.想調(diào)整到根下面去.但是由于本人新手一個(gè).又不太了解linux的分區(qū)機(jī)制.
    2010-06-06
  • 使用 bash 倒計(jì)時(shí)日期的方法

    使用 bash 倒計(jì)時(shí)日期的方法

    這篇文章主要介紹了用 bash 倒計(jì)時(shí)日期的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Linux 內(nèi)核空間與用戶空間實(shí)現(xiàn)與分析

    Linux 內(nèi)核空間與用戶空間實(shí)現(xiàn)與分析

    這篇文章主要介紹了Linux 內(nèi)核空間與用戶空間實(shí)現(xiàn)與分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Linux下如何調(diào)整根目錄的空間大小

    Linux下如何調(diào)整根目錄的空間大小

    本篇文章主要介紹了Linux下如何調(diào)整根目錄的空間大小,要是針對(duì)現(xiàn)在已有的空間進(jìn)行調(diào)整,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04

最新評(píng)論