91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

服務(wù)器驚現(xiàn)“活死人”?僵尸進(jìn)程排查、危害與解決全指南

jf_44130326 ? 來源:Linux1024 ? 2026-02-04 17:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在服務(wù)器運(yùn)維中,你是否遇到過這樣的怪事:明明任務(wù)已經(jīng)結(jié)束,進(jìn)程卻像活死人一樣賴著不走,還霸占著進(jìn)程IDPID)?這就是僵尸進(jìn)程(Zombie Process在搞鬼。今天,我們不僅拆解它的排查與解決方法,更要講清它對系統(tǒng)的隱藏危害,讓你徹底拿捏這個(gè)頑固分子

一、先搞懂:僵尸進(jìn)程到底是什么?

簡單來說,僵尸進(jìn)程是一種半成品狀態(tài)的進(jìn)程:

?子進(jìn)程已經(jīng)運(yùn)行結(jié)束(代碼執(zhí)行完、資源釋放),但父進(jìn)程沒調(diào)用wait()waitpid()回收它的身份信息(比如進(jìn)程控制塊PCB,存儲進(jìn)程PID、狀態(tài)等核心數(shù)據(jù))。

?它不占CPU、內(nèi)存,但會占用系統(tǒng)的PID資源——這是它最危險(xiǎn)的地方。

二、警惕!僵尸進(jìn)程對系統(tǒng)的3大危害

很多人覺得僵尸進(jìn)程不占資源,不用管,但忽略了它的隱性風(fēng)險(xiǎn),積累到一定程度會直接癱瘓系統(tǒng):

1.耗盡PID資源,導(dǎo)致新進(jìn)程無法創(chuàng)建

Linux系統(tǒng)的PID是有限的(默認(rèn)一般是32768,可通過/proc/sys/kernel/pid_max查看)。若大量僵尸進(jìn)程堆積,PID會被占滿,此時(shí)無論執(zhí)行ls、ssh還是啟動服務(wù),都會報(bào)錯(cuò)“Resource temporarily unavailable”(資源暫時(shí)不可用),新進(jìn)程完全無法創(chuàng)建。

2.增加內(nèi)核管理負(fù)擔(dān)

每個(gè)僵尸進(jìn)程的PCB(約幾十字節(jié))會一直存放在內(nèi)核空間。雖然單個(gè)占用小,但thousands級別的僵尸進(jìn)程會讓內(nèi)核在遍歷進(jìn)程列表(如ps、top命令)時(shí)變慢,間接影響系統(tǒng)響應(yīng)速度。

3.掩蓋父進(jìn)程的異常問題

僵尸進(jìn)程的本質(zhì)是父進(jìn)程沒盡責(zé)回收。若長期存在僵尸進(jìn)程,可能意味著父進(jìn)程本身有bug(如死鎖、信號處理邏輯缺失)或已經(jīng)卡死——此時(shí)不處理,父進(jìn)程可能會進(jìn)一步引發(fā)更嚴(yán)重的問題(如內(nèi)存泄漏、業(yè)務(wù)中斷)。

三、如何快速揪出僵尸進(jìn)程?

用兩個(gè)命令,輕松鎖定嫌疑犯

1.ps命令:精準(zhǔn)篩選僵尸進(jìn)程

在終端執(zhí)行以下命令,直接過濾出狀態(tài)為Z(僵尸)或包含defunct(已失效)的進(jìn)程:

wKgZO2kal-eAD-6LAABErXWJcq0930.png
# 方式1:顯示完整信息(推薦)ps aux |grep -E 'Z|defunct'# 方式2:只輸出關(guān)鍵信息(PID、父進(jìn)程PPID、進(jìn)程名)ps -ef | awk '$8~/Z|defunct/&&$0!~/grep/{print"PID:"$2,"PPID:"$3,"COMMAND:"$8}'

示例輸出(帶STATZ的就是僵尸進(jìn)程):

USER    PID %CPU %MEM  VSZ  RSS TTY   STAT START  TIME COMMANDroot   12340.00.0  0  0pts/0  Z+ 10:00 0:00[test] 

2.top命令:看僵尸進(jìn)程總數(shù)

執(zhí)行top后,注意頂部狀態(tài)欄的zombie計(jì)數(shù)(如zombie: 5表示有5個(gè)僵尸進(jìn)程)。若計(jì)數(shù)不為0,按f鍵勾選PPID字段,再按O鍵按STAT排序,就能快速定位所有Z狀態(tài)的進(jìn)程。

四、僵尸進(jìn)程是怎么誕生的?看反面代碼

僵尸進(jìn)程的根源是父進(jìn)程偷懶,看這段會產(chǎn)生僵尸進(jìn)程的錯(cuò)誤代碼:

#include#include#includeintmain(){ pid_tpid = fork(); // 創(chuàng)建子進(jìn)程 if(pid ==0) {   // 子進(jìn)程:執(zhí)行完立即退出   printf("子進(jìn)程 (PID: %d) 完成任務(wù),退出n",getpid());   exit(0);  }else{   // 父進(jìn)程:不回收子進(jìn)程,休眠10秒   printf("父進(jìn)程 (PID: %d) 休眠中,子進(jìn)程會變僵尸n",getpid());   sleep(10); // 這10秒內(nèi),子進(jìn)程是僵尸狀態(tài)  } return0;}

問題核心:父進(jìn)程沒有調(diào)用wait()/waitpid()回收子進(jìn)程,導(dǎo)致子進(jìn)程退出后,PCB一直留在內(nèi)核中。

五、如何送走僵尸進(jìn)程?2種正確代碼+極端方案

解決僵尸進(jìn)程的核心是讓父進(jìn)程主動回收子進(jìn)程資源,以下是兩種常用正確寫法,覆蓋不同場景:

方式1:阻塞等待回收(適用于父進(jìn)程可暫停的場景)

父進(jìn)程用waitpid()阻塞等待子進(jìn)程退出,直接回收資源,簡單直接:

#include#include#include#includeintmain(){ pid_tpid = fork(); if(pid ==0) {   printf("子進(jìn)程 (PID: %d) 執(zhí)行任務(wù)...n",getpid());   sleep(2); // 模擬任務(wù)耗時(shí)   exit(0);  }else{   printf("父進(jìn)程等待子進(jìn)程退出...n");   intstatus;   // 阻塞等待指定子進(jìn)程,回收資源   waitpid(pid, &status,0);   // 可選:解析子進(jìn)程退出狀態(tài)(正常/被信號終止)   if(WIFEXITED(status)) {     printf("子進(jìn)程正常退出,退出碼:%dn",WEXITSTATUS(status));    }   printf("子進(jìn)程已回收,無僵尸n");  } return0;}

方式2:異步處理(適用于父進(jìn)程需繼續(xù)干活的場景)

若父進(jìn)程要同時(shí)處理其他任務(wù)(如服務(wù)端程序),可通過捕獲SIGCHLD信號,在子進(jìn)程退出時(shí)自動回收,不阻塞父進(jìn)程:

#include#include#include#include#include// 信號處理函數(shù):子進(jìn)程退出時(shí)觸發(fā)voidhandle_sigchld(intsig){ pid_tpid; intstatus; // 非阻塞循環(huán),回收所有已退出的子進(jìn)程 while((pid =waitpid(-1, &status, WNOHANG)) >0) {   printf("子進(jìn)程 (PID: %d) 已回收n", pid);  }}intmain(){ // 注冊SIGCHLD信號處理函數(shù) structsigactionsa;  sa.sa_handler = handle_sigchld;  sa.sa_flags = SA_RESTART; // 重啟被信號中斷的系統(tǒng)調(diào)用 sigemptyset(&sa.sa_mask); sigaction(SIGCHLD, &sa,NULL); pid_tpid = fork(); if(pid ==0) {   printf("子進(jìn)程 (PID: %d) 執(zhí)行任務(wù)...n",getpid());   sleep(2);   exit(0);  }else{   printf("父進(jìn)程繼續(xù)處理其他任務(wù)...n");   sleep(5); // 父進(jìn)程的其他工作,不被阻塞   printf("父進(jìn)程工作結(jié)束n");  } return0;}

極端方案:殺死父進(jìn)程(謹(jǐn)慎?。?/span>

若父進(jìn)程本身卡死、無響應(yīng)(如死鎖),無法回收子進(jìn)程,可嘗試殺死父進(jìn)程(替換<父進(jìn)程PPID>為實(shí)際ID):

# 先優(yōu)雅終止kill<父進(jìn)程PPID># 若10秒后未退出,強(qiáng)制終止(會中斷父進(jìn)程業(yè)務(wù),需評估影響)kill-9 <父進(jìn)程PPID>

父進(jìn)程死后,其所有子進(jìn)程(包括僵尸)會被系統(tǒng)的init進(jìn)程(PID=1)接管,init會自動回收僵尸進(jìn)程。

六、一張思維導(dǎo)圖,梳理完整排查流程

為了讓你在實(shí)際運(yùn)維中快速上手,整理了「僵尸進(jìn)程排查驗(yàn)證全流程」思維導(dǎo)圖,按步驟操作即可:

wKgZO2kal-eAMPrHAAKc5YmqqBA700.png

七、常見誤區(qū)避雷

1.直接kill僵尸進(jìn)程?沒用!僵尸進(jìn)程已經(jīng)死透,kill信號對它無效,必須從父進(jìn)程入手。

2.少量僵尸不用管?可以,但要警惕!單個(gè)僵尸無害,但要排查父進(jìn)程是否有bug,避免后續(xù)堆積。

3.父進(jìn)程是init就安全?不一定!init會定期回收,但長期存在init接管的僵尸,說明原父進(jìn)程頻繁崩潰,需查原進(jìn)程穩(wěn)定性。

總結(jié)

僵尸進(jìn)程的本質(zhì)是父進(jìn)程沒盡責(zé),危害雖不直接,但積累后會癱瘓系統(tǒng)。記住核心解決邏輯:找父進(jìn)程讓父進(jìn)程回收預(yù)防下次發(fā)生。

下次遇到僵尸進(jìn)程,對照思維導(dǎo)圖一步步來,輕松解決!覺得有用的話,點(diǎn)贊+分享,讓更多運(yùn)維小伙伴避坑~

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11758

    瀏覽量

    219006
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    14

    文章

    10251

    瀏覽量

    91480
  • 進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    211

    瀏覽量

    14532
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    服務(wù)器遠(yuǎn)程不上服務(wù)器怎么辦?服務(wù)器無法遠(yuǎn)程的原因是什么?

    運(yùn)營商。 2.服務(wù)器網(wǎng)絡(luò)問題 解決辦法:通過路由圖來確定是哪里的線路出現(xiàn)丟包,聯(lián)系服務(wù)器商切換線路。 二、服務(wù)器問題 服務(wù)器帶寬跑滿、服務(wù)器
    發(fā)表于 02-27 16:21

    孤兒進(jìn)程僵尸進(jìn)程

    前段時(shí)間,由于研究經(jīng)典面試題,把孤兒進(jìn)程僵尸進(jìn)程也總結(jié)了一下。我們有這樣一個(gè)問題:孤兒進(jìn)程僵尸進(jìn)程
    發(fā)表于 11-29 14:08

    為什么會出現(xiàn)LINUX僵尸進(jìn)程

    僵尸進(jìn)程出現(xiàn)在父進(jìn)程沒有回收子進(jìn)程的PCB的時(shí)候,這個(gè)時(shí)候子進(jìn)程已經(jīng)結(jié)束,但是父進(jìn)程沒有回收他,
    發(fā)表于 08-07 06:48

    進(jìn)程有幾種狀態(tài)?

    ?線程間同步方法有哪些?什么是內(nèi)核線程和用戶線程?內(nèi)核線程和用戶線程的區(qū)別?內(nèi)核線程和用戶線程有什么優(yōu)缺點(diǎn)?什么是僵尸進(jìn)程,孤兒進(jìn)程,守護(hù)進(jìn)程?僵尸
    發(fā)表于 12-24 07:16

    AMD重新構(gòu)思服務(wù)器科技,現(xiàn)可支持APU服務(wù)器軟件

    AMD重新構(gòu)思服務(wù)器科技,現(xiàn)可支持APU服務(wù)器軟件,幫助服務(wù)器適應(yīng)現(xiàn)代數(shù)據(jù)中心工作負(fù)載的新一代開發(fā)工具亮相APU13開發(fā)者峰會。
    發(fā)表于 11-15 10:19 ?830次閱讀

    內(nèi)存轉(zhuǎn)發(fā)服務(wù)器

    內(nèi)存轉(zhuǎn)發(fā)服務(wù)器
    發(fā)表于 01-04 13:49 ?0次下載

    僵尸進(jìn)程的產(chǎn)生介紹和危害以及解決方法

    如果你經(jīng)常使用 Linux,你應(yīng)該遇到這個(gè)術(shù)語“僵尸進(jìn)程Zombie Processes”。 那么什么是僵尸進(jìn)程? 它們是怎么產(chǎn)生的? 它們是否對系統(tǒng)有害? 我要怎樣殺掉這些
    的頭像 發(fā)表于 12-18 15:56 ?6411次閱讀
    <b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>的產(chǎn)生介紹和<b class='flag-5'>危害</b>以及解決方法

    什么是僵尸進(jìn)程_Linux僵尸進(jìn)程可以被“殺死”嗎?

    首先要明確一點(diǎn),僵尸進(jìn)程的含義是:子進(jìn)程已經(jīng)死了,但是父進(jìn)程還沒有wait它的一個(gè)中間狀態(tài),這個(gè)時(shí)候子進(jìn)程是一個(gè)
    的頭像 發(fā)表于 07-28 10:09 ?5139次閱讀
    什么是<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>_Linux<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>可以被“殺死”嗎?

    Linux 系統(tǒng)中僵尸進(jìn)程

    Linux 系統(tǒng)中僵尸進(jìn)程和現(xiàn)實(shí)中僵尸(雖然我也沒見過)類似,雖然已經(jīng)死了,但是由于沒人給它們收尸,還能四處走動。僵尸進(jìn)程
    發(fā)表于 04-02 14:40 ?764次閱讀

    GoldBrute僵尸網(wǎng)絡(luò)針對150多萬臺RDP服務(wù)器發(fā)起攻擊

    新的僵尸網(wǎng)絡(luò)出現(xiàn),150多萬臺RDP服務(wù)器很危險(xiǎn)!
    的頭像 發(fā)表于 06-11 14:13 ?2798次閱讀

    Linux數(shù)據(jù)中心服務(wù)器上的僵尸進(jìn)程怎樣正確的處理

    。雖然僵尸進(jìn)程不像運(yùn)行中的流氓應(yīng)用程序那樣占用寶貴資源,但可能會構(gòu)成威脅。
    發(fā)表于 09-30 17:29 ?1099次閱讀
    Linux數(shù)據(jù)中心<b class='flag-5'>服務(wù)器</b>上的<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>怎樣正確的處理

    Linux服務(wù)器常見的網(wǎng)絡(luò)故障排查方法

    日常工作中我們有時(shí)會遇到服務(wù)器網(wǎng)絡(luò)不通問題,導(dǎo)致服務(wù)器無法正常運(yùn)行。要想解決服務(wù)器網(wǎng)絡(luò)故障問題,通常要先進(jìn)行網(wǎng)絡(luò)故障排查,這里以Linux服務(wù)器
    的頭像 發(fā)表于 04-14 15:47 ?3986次閱讀

    什么情況下服務(wù)器會停止響應(yīng)?怎么排查?

    服務(wù)器停止響應(yīng)意味著什么?在租用網(wǎng)站服務(wù)器的過程中,我們總是會遇到各種各樣的問題,比如最麻煩的網(wǎng)站服務(wù)器沒有響應(yīng)。讓我們簡單地談?wù)劸W(wǎng)站服務(wù)器停止響應(yīng)意味著什么,什么情況會沒有響應(yīng),以及
    的頭像 發(fā)表于 05-09 14:37 ?3002次閱讀

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

    進(jìn)程中的指令已經(jīng)執(zhí)行完成,但是進(jìn)程PCB結(jié)構(gòu)還沒有回收。   即子進(jìn)程先于父進(jìn)程退出后,子進(jìn)程的PCB需要其父
    的頭像 發(fā)表于 11-29 15:52 ?9300次閱讀
    如何查看系統(tǒng)是否有<b class='flag-5'>僵尸</b><b class='flag-5'>進(jìn)程</b>

    如何排查SMTP服務(wù)器故障

    丟失,嚴(yán)重影響業(yè)務(wù)流程和通信效率。 1. 確認(rèn)故障現(xiàn)象 在開始排查之前,首先需要明確故障的具體表現(xiàn)。這可能包括: 郵件發(fā)送失敗,用戶收到錯(cuò)誤通知。 郵件發(fā)送延遲,長時(shí)間未送達(dá)。 郵件丟失,收件人未收到郵件。 SMTP服務(wù)器服務(wù)
    的頭像 發(fā)表于 10-30 17:42 ?3659次閱讀