天天看點

如何在Linux上殺死僵屍程序

是什麼導緻Linux上的僵屍程序?

如何在Linux上殺死僵屍程式

寫得不好的父程序可能不會調用該wait()建立子程序時, 函數。 這意味着沒有任何東西在監視子程序中的狀态變化,并且該SIGCHLD信号将被忽略。 或者,可能是由于不良的程式設計或惡意的意圖,另一個應用程式正在影響父程序的執行。

但是,如果父程序不在子程序中監視狀态變化,則不會發生适當的系統内務處理。 子程序終止時,不會删除PCB和程序表中的條目。 這導緻僵屍狀态永遠不會從PCB上移除。

僵屍确實會占用一些記憶體,但通常不會造成問題。 程序表中的條目很小,但是在釋出之前,程序ID無法重用。 在64位作業系統上,這不太可能引起任何問題,因為PCB比工藝表條目大得多。

可以想象,大量的僵屍可能會影響可供其他程序使用的記憶體量。 但是,如果您有那麼多僵屍,那麼父應用程式或作業系統錯誤就是一個嚴重的問題。

如何删除僵屍程序

您無法殺死僵屍程序,因為它已經死了。 它不會對任何信号做出響應,因為它已從記憶體中删除了-無處發送SIGKILL信号。 您可以嘗試将 發送SIGCHLD信号 給父程序,但是如果子程序終止時它不起作用,那麼現在也不大可能起作用。

唯一可靠的解決方案是殺死父程序。 終止時,其子程序将被該 繼承init程序 ,這是在Linux系統中運作的第一個程序(其程序ID為1)。

該init程序定期執行必要的清理僵屍的操作,是以要殺死它們,您隻需殺死建立它們的程序即可。 該top指令是檢視是否有僵屍的便捷方法。

輸入以下内容:

如何在Linux上殺死僵屍程式

該系統具有八個僵屍程序。 我們可以 列出來列出它們 通過使用 通過ps指令并将其 管道 egrep。 同樣,僵屍程序的狀态标志為“ Z”,您通常還會看到“已失效”。

輸入以下内容:

如果你在學習C/C++的過程中遇到了問題,可以來加入小編的企鵝圈問小編哦~小編很熱情的(●’◡’●)​​​​​​​

ps aux | egrep“ Z |已終止”

如何在Linux上殺死僵屍程式

列出了僵屍程序。

如何在Linux上殺死僵屍程式

與來復原動浏覽相比,這是發現僵屍程序ID的一種更巧妙的方法top。 我們還看到一個名為“ badprg”的應用程式産生了這些僵屍。

第一個僵屍的程序ID是7641,但是我們需要找到其父程序的程序ID。 我們可以 使用ps再次 。 我們将使用輸出選項(-o)告知ps僅顯示父級的程序ID,然後将其與 一起傳遞ppid=标志 。

我們要查找的程序将使用 訓示-p(process)選項 ,然後傳入僵屍的程序ID。

是以,我們鍵入以下指令以查找程序7641的程序資訊,但它将僅報告父程序的ID:

ps -o ppid = -p 7641

如何在Linux上殺死僵屍程式

我們被告知父程序ID為7636。我們現在可以 使用它來交叉引用它ps再次 。

如何在Linux上殺死僵屍程式

我們看到這與之前的父程序的名稱比對。 要終止父程序,請在kill指令中使用SIGKILL選項,如下所示:

殺死-SIGKILL 7636

根據父流程的所有者,您可能還需要使用sudo。

僵屍并不可怕……

…除非他們陷入大群。 沒什麼可擔心的,隻需重新啟動即可清除它們。

但是,如果您發現某個應用程式或程序始終在生成僵屍,則應注意這一點。 它很可能隻是一個草率的程式,在這種情況下,也許有一個更新的版本可以在子程序之後正确進行清理。

繼續閱讀