亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

使用Top命令查找,當(dāng)zombie前的數(shù)量不為0時,即系統(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)程,此時就需要?dú)⑺澜┦M(jìn)程的父進(jìn)程。

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

然后使用上面第二步的語句查詢該僵尸進(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(命令)

因為狀態(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會保留一段時間等待父進(jìn)程在PCB中獲取退出碼,,且該進(jìn)程不可執(zhí)行,此時子進(jìn)程變成僵尸進(jìn)程)。

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

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

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

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

在這里插入圖片描述

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

  • 如果只有一兩個僵死進(jìn)程,沒有什么影響。
  • 如果有很多個僵死進(jìn)程,持續(xù)不斷的產(chǎn)生,就有影響了,因為子進(jìn)程的PCB如果沒有被釋放,進(jìn)程的PID就被一直占著,在內(nèi)核空間中,PCB本身是結(jié)構(gòu)體,會占用內(nèi)存空間,對系統(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)會將這種沒有子進(jìn)程的父進(jìn)程當(dāng)做孤兒進(jìn)程OS會給該孤兒進(jìn)程重新尋找一個父進(jìn)程Init進(jìn)程,其PID == 1,通常會收養(yǎng)那些沒有父進(jìn)程的子進(jìn)程,就會直接獲取其退出碼從而消除該進(jìn)程的僵死狀態(tài) [ 其內(nèi)部其實也是調(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就會阻塞等待子進(jìn)程結(jié)束。

我們來看一下wait的參考手冊:

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

此時val的值為0

在這里插入圖片描述

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

在這里插入圖片描述

這是為什么呢?

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

這里引入一個概念,在下一期Linux專欄將會講到信號

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

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

總結(jié)

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

相關(guān)文章

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

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

    我們在使用虛擬機(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模式,本文我們將對這三種模式進(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錯誤的解決

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

    這篇文章主要介紹了Ubuntu使用國內(nèi)源出現(xiàn)Hash Sum mismatch錯誤的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • linux服務(wù)器之LVS、Nginx和HAProxy負(fù)載均衡器對比總結(jié)

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

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

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

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

    使用 bash 倒計時日期的方法

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

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

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

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

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

最新評論