chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

一、先搞懂:僵尸進程到底是什么?

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

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

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

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

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

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

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

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

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

3.掩蓋父進程的異常問題

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

三、如何快速揪出僵尸進程?

用兩個命令,輕松鎖定嫌疑犯

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

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

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

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

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命令:看僵尸進程總數(shù)

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

四、僵尸進程是怎么誕生的?看反面代碼

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

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

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

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

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

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

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

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

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

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

#include#include#include#include#include// 信號處理函數(shù):子進程退出時觸發(fā)voidhandle_sigchld(intsig){ pid_tpid; intstatus; // 非阻塞循環(huán),回收所有已退出的子進程 while((pid =waitpid(-1, &status, WNOHANG)) >0) {   printf("子進程 (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("子進程 (PID: %d) 執(zhí)行任務(wù)...n",getpid());   sleep(2);   exit(0);  }else{   printf("父進程繼續(xù)處理其他任務(wù)...n");   sleep(5); // 父進程的其他工作,不被阻塞   printf("父進程工作結(jié)束n");  } return0;}

極端方案:殺死父進程(謹(jǐn)慎!)

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

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

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

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

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

wKgZO2kal-eAMPrHAAKc5YmqqBA700.png

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

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

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

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

總結(jié)

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

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

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

    關(guān)注

    88

    文章

    11760

    瀏覽量

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

    關(guān)注

    14

    文章

    10253

    瀏覽量

    91502
  • 進程
    +關(guān)注

    關(guān)注

    0

    文章

    211

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

    孤兒進程僵尸進程

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

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

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

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

    ?線程間同步方法有哪些?什么是內(nèi)核線程和用戶線程?內(nèi)核線程和用戶線程的區(qū)別?內(nèi)核線程和用戶線程有什么優(yōu)缺點?什么是僵尸進程,孤兒進程,守護進程?僵尸
    發(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ā)工具亮相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次下載

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

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

    什么是僵尸進程_Linux僵尸進程可以被“殺死”嗎?

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

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

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

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

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

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

    。雖然僵尸進程不像運行中的流氓應(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'>進程</b>怎樣正確的處理

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

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

    什么情況下服務(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 ?3010次閱讀

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

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

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

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