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

linux如何查看僵尸進程

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

linux查看僵尸進程

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

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

linux查看僵尸進程
 

2、定位僵尸進程

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

3、殺死僵尸進程

使用Kill -HUP 僵尸進程ID來殺死僵尸進程,往往此種情況無法殺死僵尸進程,此時就需要殺死僵尸進程的父進程。

kill -HUP 僵尸進程父ID

然后使用上面第二步的語句查詢該僵尸進程是否被殺死。

4、參數(shù)解讀

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

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

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

因為狀態(tài)為z或者Z的進程為僵尸進程,所以我們使用grep抓取stat狀態(tài)為zZ進程

linux僵尸進程及僵尸進程的處理

僵尸進程

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

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

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

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

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

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

模擬僵尸進程:

在這里插入圖片描述

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

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

何處理僵尸進程

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

此時val的值為0

在這里插入圖片描述

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

在這里插入圖片描述

這是為什么呢?

其實768對應(yīng)的二進制數(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)用的最佳時機:子進程退出的那一時刻,父進程調(diào)用wait;

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

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

    Systemd是Linux的系統(tǒng)和服務(wù)管理器; init進程的替代品,與SysV 和LSB init腳本兼容,systemctl命令是管理systemd的主要工具,在這篇文章中,我們將演示如何 Linux中列出systemd下所有正在運行的服務(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負載均衡器對比總結(jié)

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

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

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

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

    使用 bash 倒計時日期的方法

    這篇文章主要介紹了用 bash 倒計時日期的相關(guān)知識,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    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)在已有的空間進行調(diào)整,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04

最新評論