解析Linux操作系統(tǒng)僵尸進程 |
發(fā)布時間: 2012/8/19 16:21:08 |
詳細解析Linux操作系統(tǒng)僵尸進程, 在fork()/execve()過程中,假設(shè)子進程結(jié)束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數(shù)調(diào)用waitpid()等待子進程結(jié)束,又沒有顯式忽略該信號,則子進程成為僵尸進程,無法正常結(jié)束,此時即使是root身份kill 在fork()/execve()過程中,假設(shè)子進程結(jié)束時父進程仍存在,而父進程fork()之前既沒安裝SIGCHLD信號處理函數(shù)調(diào)用waitpid()等待子進程結(jié)束,又沒有顯式忽略該信號,則子進程成為僵尸進程,無法正常結(jié)束,此時即使是root身份kill-9也不能殺死僵尸進程。補救辦法是殺死僵尸進程的父進程(僵尸進程的父進程必然存在),僵尸進程成為"孤兒進程",過繼給1號進程init,init始終會負責(zé)清理僵尸進程。 僵尸進程是指的父進程已經(jīng)退出,而該進程dead之后沒有進程接受,就成為僵尸進程.(zombie)進程 怎樣產(chǎn)生僵尸進程的: 一個進程在調(diào)用exit命令結(jié)束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進程退出,但也僅僅限于將一個正常的進程變成一個僵尸進程,并不能將其完全銷毀)。在Linux進程的狀態(tài)中,僵尸進程 是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進程列表中保留一個位置,記載該進程的退 出狀態(tài)等信息供其他進程收集,除此之外,僵尸進程不再占有任何內(nèi)存空間。它需要它的父進程來為它收尸,如果他的父進程沒安裝SIGCHLD信 號處理函數(shù)調(diào)用wait或waitpid()等待子進程結(jié)束,又沒有顯式忽略該信號,那么它就一直保持僵尸狀態(tài),如果這時父進程結(jié)束了,那么init進程自動 會接手這個子進程,為它收尸,它還是能被清除的。但是如果如果父進程是一個循環(huán),不會結(jié)束,那么子進程就會一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時會有很多的僵尸進程。 怎么查看僵尸進程: 利用命令ps,可以看到有標(biāo)記為Z的進程就是僵尸進程。 怎樣來清除僵尸進程: 1.改寫父進程,在子進程死后要為它收尸。具體做法是接管SIGCHLD信號。子進程死后,會發(fā)送SIGCHLD信號給父進程,父進程收到此信號后,執(zhí)行waitpid()函數(shù)為子進程收尸。這是基于這樣的原理:就算父進程沒有調(diào)用wait,內(nèi)核也會向它發(fā)送SIGCHLD消息,盡管對的默認處理是忽略,如果想響應(yīng)這個消息,可以設(shè)置一個處理函數(shù)。 2.把父進程殺掉。父進程死后,僵尸進程成為"孤兒進程",過繼給1號進程init,init始終會負責(zé)清理僵尸進程.它產(chǎn)生的所有僵尸進程也跟著消失。 =========================================== 在Linux中可以用 ps auwx 發(fā)現(xiàn)僵尸進程 a all w/ tty, including other users 所有窗口和終端,包括其他用戶的進程 u user-oriented 面向用戶(用戶友好) -w,w wide output 寬格式輸出 x processes w/o controlling ttys 在僵尸進程后面 會標(biāo)注 ps axf 看進程樹,以樹形方式現(xiàn)實進程列表 ps axm 會把線程列出來,在linux下進程和線程是統(tǒng)一的,是輕量級進程的兩種方式。 ps axu 顯示進程的詳細狀態(tài) =========================================== killall kill -15 kill -9 一般都不能殺掉 defunct進程 用了kill -15,kill -9以后 之后反而會多出更多的僵尸進程 kill -kill pid fuser -k pid 可以考慮殺死他的parent process, kill -9 他的parent process 一個已經(jīng)終止,但是其父進程尚未對其進行善后處理(獲取終止子進程的有關(guān)信息、釋放它仍占用的資源)的進程被稱為僵死進程(Zombie Process)。
本文出自:億恩科技【mszdt.com】 服務(wù)器租用/服務(wù)器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |