linux僵死
A. linux裡面什麼是僵屍進程
僵屍進程是當子進程比父進程先結束,而父進程又沒有回收子進程,釋放子進程佔用的資源,此時子進程都將成為一個僵屍進程。如果父進程先退出,子進程被init接管,子進程退出後init會收回其佔用的相關資源。
我們都知道進程的工作原理。我們啟動一個程序,開始我們的任務,然後等任務結束了,我們就停止這個進程。進程停止後,該進程就會從進程表中移除。
你可以通過System-Monitor查看當前進程。
In UNIX System terminology, a process that has terminated,but whose parent
has not yet waited for it, is called a
zombie.在Unix系統中,一個進程結束了,但是它的父進程沒有等待它,那麼它將變成一個僵屍進程。但是如果該進程的父進程已經先結束了,那麼該進程就不會變僵屍進程,因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程,看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由init來接管他,成為他的父進程。
怎麼查看僵屍進程?
利用命令ps,可以看到有父進程ID為1的進程是孤兒進程;s狀態為z的是僵屍進程。
注意:孤兒進程是尚未終止但已停止的進程,但其父進程已經終止,由init收養;而僵屍進程則是已終止的進程,其父進程不一定終止。
B. linux進程的幾種狀態
Linux中進程分類
①交互進程:由一個shell啟動的進程,交互進程既可以在前台運行,也可以在後台運行。
②批處理進程:這種進程和終端沒有聯系,是一個進程序列。
③監控進程:也稱守護進程,是一個在後台運行且不受任何終端控制的特殊進程,用於執行特定的系統任務。
進程的狀態
①可運行狀態:此時進程正在運行或者正在運行隊列中等待准備運行。
②等待狀態:此時進程在等待一個事件的發生或某種系統資源。在Linux系統中等待狀態又細分為兩種等待狀態:可中斷的等待狀態和不可中斷的等待狀態。
③暫停狀態:處於暫停狀態的進程被暫停運行。
④僵死狀態:每個進程在運行結束後都會處於僵死狀態,等待父進程調用進而釋放系統資源,處於該狀態的進程已經運行結束,但是它的父進程還沒有釋放其系統資源。
C. Linux常見死機原因
在排除了硬體故障/firmware版本/BIOS等等問題之外, Linux死機通常可能碰到如下幾種情況
1, 如果你的Linux死機的時候控制台上有亂七八糟的字元。恭喜你,這種情況叫做oops. 通常是Linux kernel認為自己發生了異常造成的。
可以通過oops消息查找出錯的地方。
2, 如果你的機器僵死,那麼問題麻煩了。這種時候,通常是Kernel出現了死鎖。Kernel不會知道自己死鎖了,所以不會在屏幕上顯示任何咚咚。
如果運氣好,此時Kernel也許可能能夠響應中斷。不管怎樣,你都無法進一步操作了。
3, 嚴格來說,這第三種情況不算死機,現象如下:輸入命令回車之後命令不能返回任何結果, 但是控制台對回車可能有相應。但是命令無法結束,也不會有輸出結果。
但是可以換到下一個控制台, 而且還可以繼續輸入命令,但是輸入命令之後還是沒有輸出。這種情況會有很多可能。通常是應用程序的系統調用長時間沒有返回或者是滿足不了應用的要求。
以上三種情況,system log的作用都不大。通常日誌都不會紀錄。所以只能使用Kernel的Debug工具。
不過Linus比較狠,人說Kernel不需要Debug工具。所以kernel.org中的代碼是沒有debug工具的。不過目前絕大多數發行版的kernel都帶了debug工具,而且工具都不一樣。
通常進行kernel debug都需要在出現故障的時候採集vmcore. 就是把故障發生的時memory mp出來。(還記得Windows 藍屏的時候會出現1%-100%跳動的一個數字和c盤mp.sys文件, 這回知道干什麼的了吧? )然後進行分析。也許你會擔心Linux死機了,還怎麼mp memory啊,這個不用擔心,Kernel還是留了好幾條路子。其中一個是NMI。
那麼到底怎麼mp memory呢? 這里用REDHAT為例,RHEL3,RHEL4中都使用了netmp作為採集工具,RHEL5使用kmp作為採集工具。
採集完畢就可以對vmcore進行分析,步驟就不細說了。可以參考如下文章:http://people.redhat.com/anderson/crash_whitepaper/
但是對於管理員來說,任何一個debug工具都需要代碼開發的經歷才能順利使用。
最後說一句,最近在壇中看到有人看到死機就往應用程序上懷疑。這是很好的自我批評的精神,要大力發揚。
那麼,腳本,應用程序會不會導致死機? 當然,但是問題還是出在Kernel上。就比如,應用程序寫文件,系統可能會掛起在kernel中的文件系統代碼上。
D. ubuntu Linux怎麼解決僵屍進程
僵屍進程的產生是因為父進程沒有 wait() 子進程。所以如果我們自己寫程序好前的話一定要在父進程中通過 wait() 來避免僵屍進程的產生。
當系統中出現了僵屍進程時,我們是無法通過 kill 命令把它清旦襪塌除掉的。模圓但是我們可以殺死它的父進程,讓它變成孤兒進程,並進一步被系統中管理孤兒進程的進程收養並清理。
E. ubuntu Linux怎麼解決僵屍進程
inux 允許進程查詢內核以獲得其父進程的 PID,或者其任何子進程的執行狀態。例如,進程可以創建一個子進程來執行特定的任務,然後調用諸如 wait() 這樣的一些庫函數檢查子進程是否終止。如果子進程已經終止,那麼,它的終止代號將告訴父進程這個任務是否已成功地完成。
為了遵循這些設計原則,不允許 Linux 內核在進程一終止後就丟棄包含在進程描述符欄位中的數據。只有父進程發出了與被終止的進程相關的 wait() 類系統調用之後,才允許這樣做。這就是引入僵死狀態的原因:盡管從技術上來說進程已死,但必須保存它的描述符,直到父進程得到通知。
如果一個進程已經終止,但是它的父進程尚未調用 wait() 或 waitpid() 對它進行清理,這時的進程狀態稱為僵死狀態,處於僵死狀態的進程稱為僵屍進程(zombie process)。任何進程在剛終止時都是僵屍進程,正常情況下,僵屍進程都立刻被父進程清理了