程序狀態解析 如何殺死殭屍程序

2021-08-04 04:51:17 字數 1728 閱讀 8280

某日利用阿里雲的基線檢查,發現2個殭屍程序,因此,我想要殺死它們。怎麼殺?首先先的抓出殭屍。

執行的程序,都會有程序的狀態

只有在該狀態的程序才可能在cpu上執行。而同一時刻可能有多個程序處於可執行狀態,這些程序的task_struct結構(程序控制塊)被放入對應cpu的可執行佇列中(乙個程序最多只能出現在乙個cpu的可執行佇列中)。程序排程器的任務就是從各個cpu的可執行佇列中分別選擇乙個程序在該cpu上執行。

很多作業系統教科書將正在cpu上執行的程序定義為running狀態、而將可執行但是尚未被排程執行的程序定義為ready狀態,這兩種狀態在linux下統一為 task_running狀態。

處於這個狀態的程序因為等待某某事件的發生(比如等待socket連線、等待訊號量),而被掛起。這些程序的task_struct結構被放入對應事件的等待佇列中。當這些事件發生時(由外部中斷觸發、或由其他程序觸發),對應的等待佇列中的乙個或多個程序將被喚醒。

通過ps命令我們會看到,一般情況下,程序列表中的絕大多數程序都處於task_interruptible狀態(除非機器的負載很高)。畢竟cpu就這麼一兩個,程序動輒幾十上百個,如果不是絕大多數程序都在睡眠,cpu又怎麼響應得過來。

與task_interruptible狀態類似,程序處於睡眠狀態,但是此刻程序是不可中斷的。不可中斷,指的並不是cpu不響應外部硬體的中斷,而是指程序不響應非同步訊號。

絕大多數情況下,程序處在睡眠狀態時,總是應該能夠響應非同步訊號的。否則你將驚奇的發現,kill -9竟然殺不死乙個正在睡眠的程序了!於是我們也很好理解,為什麼ps命令看到的程序幾乎不會出現task_uninterruptible狀態,而總是task_interruptible狀態。

而task_uninterruptible狀態存在的意義就在於,核心的某些處理流程是不能被打斷的。如果響應非同步訊號,程式的執行流程中就會被插入一段用於處理非同步訊號的流程(這個插入的流程可能只存在於核心態,也可能延伸到使用者態),於是原有的流程就被中斷了。(參見《linux核心非同步中斷**》)

在程序對某些硬體進行操作時(比如程序呼叫read系統呼叫對某個裝置檔案進行讀操作,而read系統呼叫最終執行到對應裝置驅動的**,並與對應的物理裝置進行互動),可能需要使用task_uninterruptible狀態對程序進行保護,以避免程序與裝置互動的過程被打斷,造成裝置陷入不可控的狀態。這種情況下的task_uninterruptible狀態總是非常短暫的,通過ps命令基本上不可能捕捉到。

ps -e -o stat,ppid,pid,cmd | grep -e '^z'

z    24037  2588 [php] z    24037 32263 [php]

發現2個php的殭屍程序,現在我們來kill掉它們,然而,嘗試了kill和kill -9仍然幹不掉它們。最好,結束了它們的父程序,才解決。

在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他,那麼他將變成乙個殭屍程序。當用ps命令觀察程序的執行狀態時,看到這些程序的狀態列為defunct。殭屍程序是乙個早已死亡的程序,但在程序表(processs table)中仍佔了乙個位置(slot)。

但是如果該程序的父程序已經先結束了,那麼該程序就不會變成殭屍程序。因為每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序,看看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init程序來接管他,成為他的父程序,從而保證每個程序都會有乙個父程序。而init程序會自動wait其子程序,因此被init接管的所有程序都不會變成殭屍程序。

如何殺死殭屍程序?

如何殺死殭屍程序?殭屍程序用kill命令是無法殺掉的,但是我們可以結果掉殭屍程序的爸爸,殭屍daddy掛了之後,殭屍程序就成了孤兒程序,孤兒程序不會占用系統資源,會被init程式收養,然後init程式將其 ps a o stat,ppid,pid,cmd grep e zz 先檢視具體程序 kill...

如何殺死linux zombie殭屍程序

zombie 殭屍狀態,表示程序結束但尚未消亡的一種狀態,此時程序已經結束執行並釋放大部分資源,但尚未釋放程序控制塊。與zombie對應的程序狀態還有running 正在執行或等待執行狀態 uninterruptable 不可中斷阻塞狀態 interruptable 可中斷阻塞狀態 stopped ...

如何殺死linux zombie殭屍程序

百科 zombie 殭屍狀態,表示程序結束但尚未消亡的一種狀態,此時程序已經結束執行並釋放大部分資源,但尚未釋放程序控制塊。與zombie對應的程序狀態還有running 正在執行或等待執行狀態 uninterruptable 不可中斷阻塞狀態 interruptable 可中斷阻塞狀態 stopp...