農林漁牧網

您現在的位置是:首頁 > 林業

UnixLinux 處理殭屍程序的方法

2022-05-22由 重慶思莊 發表于 林業

殭屍程序怎麼處理

UnixLinux 處理殭屍程序的方法

找出父程序號,然後kill 父程序,之後子程序(殭屍程序)會被託管到其他程序,如init程序,然後由init程序將子程序的屍體(task_struct)釋放掉。

除了透過ps 的狀態來檢視Zombi程序,還可以用如下命令檢視:

[oracle@rac1 ~]$ ps -ef|grep defun

oracle 13526 12825 0 16:48 pts/1 00:00:00 grepdefun

oracle 2833028275 0 May18? 00:00:00 [Xsession]

殭屍程序解決辦 法:

(1)改寫父程序,在子程序死後要為它收屍。

具體做法是接管SIGCHLD訊號。子程序死後,會發送SIGCHLD訊號給父程序,父程序收到此訊號後,執行 waitpid()函式為子程序收屍。這是基於這樣的原理:就算父程序沒有呼叫wait,核心也會向它傳送SIGCHLD訊息,儘管對的預設處理是忽略,如果想響應這個訊息,可以設定一個處理函式。

(2)把父程序殺掉。

父程序死後,殭屍程序成為“孤兒程序”,過繼給1號程序init,init始終會負責清理殭屍程序.它產生的所有殭屍程序也跟著消失。如:

kill -9 `ps -ef |grep “Process Name” | awk ‘{ print $3 }’`

其中,“ProcessName”為處於zombie狀態的程序名。

(3)殺父程序不行的話,就嘗試用skill -t TTY關閉相應終端,TTY是程序相應的tty號(終 端號)。但是,ps可能會查不到特定程序的tty號,這時就需要自己判斷了。

(4)重啟系統,這也是最常用到方法之一。

2。6 X (task_dead -exit_dead):退出狀態,程序即將被銷燬

程序在退出過程中也可能不會保留它的task_struct。比如這個程序是多執行緒程式中被detach過的進 程。或者父程序透過設定sigchld訊號的handler為sig_ign,顯式的忽略了sigchld訊號。(這是posix的規定,儘管子程序的退出訊號可以被設定為sigchld以外的其他訊號。)

此時,程序將被置於exit_dead退出狀態,這意味著接下來的程式碼立即就會將該程序徹底釋放。所以exit_dead狀態是非常短暫的,幾乎不可能透過ps命 令捕捉到。

三。 程序狀態變化說明

3。1 程序的初始狀態

程序是透過fork系列的系統呼叫(fork、clone、vfork)來建立的,核心(或核心模組)也可以透過kernel_thread函式建立核心程序。這些建立子程序的函式本質上都完成了相同的功能——將呼叫程序複製一份,得到子程序。(可以透過選項引數來決定各種資源是共享、還是私有。)

那麼既然呼叫程序處於task_running狀態(否則,它若不是正在執行,又怎麼進行呼叫?),則子程序預設也處於task_running狀態。

另外,在系統呼叫呼叫clone和核心函式kernel_thread也接受clone_stopped選項,從而將子程序的初始狀態置為 task_stopped。

3。2 程序狀態變遷

程序自建立以後,狀態可能發生一系列的變化,直到程序退出。而儘管程序狀態有好幾種,但是程序狀態的變遷卻只有兩個方向——從task_running狀態變為非task_running狀態、或者從非task_running狀態變為task_running狀態。

也就是說,如果給一個task_interruptible狀態的程序傳送sigkill訊號,這個程序將先被喚醒(進入task_running狀態),然後再響應sigkill訊號而退出(變為task_dead狀態)。並不會從task_interruptible狀態直接退出。

進 程從非task_running狀態變為task_running狀態,是由別的程序(也可能是中斷處理程式)執行喚醒操作來實現的。執行喚醒的程序設定被喚醒程序的狀態為task_running,然後將其task_struct結構加入到某個cpu的可執行佇列中。於是被喚醒的程序將有機會被排程執行。

而程序從task_running狀態變為 非task_running狀態,則有兩種途徑:

1、響應訊號而進入task_stoped狀態、或task_dead狀態;

2、執行系統呼叫主動進入task_interruptible狀態(如nanosleep系統呼叫)、或task_dead狀態(如exit系統呼叫);或由於執行系統呼叫需要的資源得不到滿足,而進入task_interruptible狀態或task_uninterruptible狀態(如select系統呼叫)。

顯然,這兩種情況都只能發生在程序正在cpu上執行的情況下。

UnixLinux 處理殭屍程序的方法