如何在linux上殺死殭屍程序

寫得不好或執行得不好的程式會讓殭屍程序潛伏在Linux計算機中。瞭解殭屍是如何產生的,以及如何讓它們最終安息。...

寫得不好或執行得不好的程式會讓殭屍程序潛伏在Linux計算機中。瞭解殭屍是如何產生的,以及如何讓它們最終安息。

程序狀態如何在linux上工作

當然,Linux必須跟蹤計算機上執行的所有應用程式和守護程序。其中一種方法是維護程序表。這是核心記憶體中的結構列表。每個程序在此列表中都有一個條目,其中包含有關它的一些資訊。

每個程序表結構中都沒有太多內容。它們包含程序ID、一些其他資料項和指向該程序的程序控制塊(PCB)的指標。

PCB儲存了Linux需要為每個程序查詢或設定的許多細節。PCB也會隨著程序的建立、給定的處理時間以及最終的銷燬而更新。

Linux PCB包含超過95個欄位。它被定義為一個名為task_struct.h的結構,長度超過700行。PCB包含以下型別的資訊:

  • 程序狀態:狀態描述如下。
  • 程序號:它在作業系統中的唯一識別符號。
  • 程式計數器:當這個程序下一次被賦予訪問CPU的許可權時,系統將使用這個地址來查詢應該執行的程序的下一條指令。
  • 暫存器:這個程序使用的CPU暫存器的列表。該列表可能包含累加器、索引暫存器和堆疊指標。
  • 開啟檔案列表:與此程序關聯的檔案。
  • CPU排程資訊:用於確定分配給該程序的CPU處理時間的頻率和持續時間。程序的優先順序、指向排程佇列的指標和其他排程引數必須記錄在PCB中。
  • 記憶體管理資訊:有關此程序正在使用的記憶體的詳細資訊,例如程序記憶體的起始地址和結束地址,以及指向記憶體頁的指標。
  • I/O狀態資訊:程序使用的任何輸入或輸出裝置。

“程序狀態”可以是以下任一狀態:

  • R:正在執行或可執行的程序。執行意味著它接收CPU週期並執行。可執行程序已準備好執行並等待CPU插槽。
  • 學生:睡眠過程。程序正在等待操作完成,例如輸入或輸出操作,或者等待資源可用。
  • D:程序處於不間斷睡眠狀態。它正在使用阻塞系統呼叫,在系統呼叫完成之前無法繼續。與“睡眠”狀態不同,處於這種狀態的程序在系統呼叫完成並且執行返回到程序之前不會響應訊號。
  • T:程序已終止(停止),因為它接收到SIGSTOP訊號。它將只響應SIGKILL或SIGCONT訊號,這兩個訊號分別終止程序或指示程序繼續。這就是從前臺(fg)任務切換到後臺(bg)任務時發生的情況。
  • Z:殭屍程式。當一個過程完成時,它不會消失。它釋放所有正在使用的記憶體,並將自己從記憶體中移除,但它在程序表和PCB中的條目仍然保留。它的狀態設定為EXIT\u ZOMBIE,並且它的父程序(透過SIGCHLD訊號)被通知子程序已經完成。

 

在Zombie狀態下,建立子程序時,父程序呼叫wait()函式族之一。然後等待子程序中的狀態更改。子程序是否已被訊號停止、繼續或終止?它是否透過執行程式碼的自然完成而終止?

如果狀態更改意味著子程序已停止執行,則讀取其退出程式碼。然後,銷燬子PCB並刪除其在程序表中的條目。理想情況下,這一切都發生在眨眼之間,處於殭屍狀態的程序不會存在很長時間。

相關:如何在Linux上執行和控制後臺程序

是什麼導致linux上的殭屍程序?

編寫不好的父程序在建立子程序時可能不會呼叫wait()函式。這意味著沒有任何東西在監視子程序中的狀態變化,SIGCHLD訊號將被忽略。或者,另一個應用程式正在影響父程序的執行,這可能是由於程式設計不當或惡意意圖造成的。

但是,如果父程序沒有監視子程序中的狀態更改,則不會進行適當的系統內務管理。當子程序終止時,不會刪除PCB和程序表中的條目。這將導致殭屍狀態永遠不會從PCB中移除。

殭屍確實需要一些記憶體,但它們通常不會造成問題。程序表中的條目很小,但是在它被釋放之前,程序ID不能被重用。在64位作業系統上,這不太可能導致任何問題,因為PCB比程序表條目大得多。

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

如何刪除殭屍程序

你不能殺死殭屍程序,因為它已經死了。它不會對任何訊號做出響應,因為它已經從記憶體中刪除了,沒有地方可以傳送SIGKILL訊號。您可以嘗試向父程序傳送SIGCHLD訊號,但是如果在子程序終止時它不起作用,那麼現在也不太可能起作用。

唯一可靠的解決方案是終止父程序。終止時,它的子程序由init程序繼承,init程序是在Linux系統中執行的第一個程序(其程序ID為1)。

init程序定期執行必要的殭屍清理,所以要殺死它們,只需殺死建立它們的程序。top命令是檢視是否有殭屍的方便方法。

鍵入以下內容:

top

如何在linux上殺死殭屍程序

這個系統有八個殭屍程序。我們可以使用ps命令並將其管道化到egrep中來列出這些。同樣,zombie程序的狀態標誌是“Z”,您通常還會看到“defunct”

鍵入以下內容:

ps aux | egrep "Z|defunct"

如何在linux上殺死殭屍程序

將列出殭屍程序。

如何在linux上殺死殭屍程序

這是一個更整潔的方式來發現殭屍的程序ID比在頂部來回滾動。我們還看到一個名為“badprg”的應用程式產生了這些殭屍。

第一個殭屍的程序ID是7641,但是我們需要找到其父程序的程序ID。我們可以再次使用ps。我們將使用output選項(-o)告訴ps只顯示父程序ID,然後用ppid=flag傳遞它。

我們要查詢的程序將透過使用-p(process)選項來指示,然後傳入zombie的程序ID。

因此,我們鍵入以下命令來查詢程序7641的程序資訊,但它只報告父程序的ID:

ps -o ppid= -p 7641

如何在linux上殺死殭屍程序

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

如何在linux上殺死殭屍程序

我們看到它與前面的父程序的名稱相匹配。要終止父程序,請將SIGKILL選項與kill命令一起使用,如下所示:

kill -SIGKILL 7636

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

殭屍並不可怕…

…除非他們在一個龐大的部落裡。有幾個是不需要擔心的,一個簡單的重啟將消滅他們。

但是,如果您注意到某個應用程式或程序總是在生成殭屍,那麼您應該對此進行研究。它很可能只是一個草率編寫的程式,在這種情況下,可能有一個更新的版本,可以在其子程序之後進行適當的清理。

  • 發表於 2021-04-01 07:47
  • 閱讀 ( 57 )
  • 分類:網際網路

你可能感興趣的文章

收穫的好處守望的萬聖節恐怖事件!

... 繼續讀下去,瞭解這項活動到底提供了什麼,以及如何征服令人恐懼的容肯斯坦! ...

  • 發佈於 2021-03-12 18:01
  • 閲讀 ( 51 )

殺死所有的殭屍,你可以在這8個免費手機遊戲

你不必等到萬聖節才能享受一個好的恐怖遊戲。而說到殭屍,不死生物肯定會在一年中的任何時候出現。從卡通風格的休閒遊戲到逼真的第一人稱射擊遊戲,這裡有8款很棒的移動殭屍遊戲來測試你的生存技能。 ...

  • 發佈於 2021-03-12 22:58
  • 閲讀 ( 46 )

為什麼需要刪除不再使用的殭屍應用

...全,你甚至沒有意識到。下面是殭屍應用程式的問題以及如何處理它們。 ...

  • 發佈於 2021-03-13 21:09
  • 閲讀 ( 40 )

你應該玩的棋盤遊戲,基於你最喜歡的電子遊戲

...創造沉浸式氛圍的遊戲,這就是適合你的遊戲。看看它是如何排名在最漂亮的棋盤遊戲與非凡的藝術品! ...

  • 發佈於 2021-03-14 20:00
  • 閲讀 ( 63 )

你應該買《使命召喚:無限戰爭》嗎?

...派系,任務是你在一場比賽中完成一些小任務,比如用**殺死五個人。完成這些解鎖特殊裝備。 ...

  • 發佈於 2021-03-16 23:44
  • 閲讀 ( 47 )

linux中殺死無響應程式的7種方法

...是最好的應用程式也可能掛起。與其等待它們崩潰,不如殺死這些沒有響應的程式。事實上,有很多方法可以殺死Linux程式,你可能會發現自己被寵壞了! ...

  • 發佈於 2021-03-18 00:56
  • 閲讀 ( 51 )

什麼是超級酷?下面是如何正確移除它們

... 以下是你需要知道的關於超級酷的東西——以及如何刪除它們。 ...

  • 發佈於 2021-03-19 21:59
  • 閲讀 ( 53 )

linux命令參考備忘單

...便的Linux命令備忘單。如果您想執行其中的幾個,請檢視如何在帶螢幕的Linux終端上執行多工。 ...

  • 發佈於 2021-03-22 04:06
  • 閲讀 ( 56 )

什麼是mylobot惡意軟體?它是如何工作的,該怎麼辦

網路安全是一個永恆的戰場。2017年,安全研究人員每天發現約23000個新的惡意軟體樣本(即每小時795個)。 ...

  • 發佈於 2021-03-24 09:02
  • 閲讀 ( 87 )

駭客如何利用殭屍網路破壞你最喜歡的網站

... 讓我們看看殭屍網路的力量是如何擴張的,以及你聽到的下一個巨大的DDoS將如何比上一個更大。 ...

  • 發佈於 2021-03-25 10:49
  • 閲讀 ( 42 )