1. 程式人生 > 其它 >Linux中的殭屍程序

Linux中的殭屍程序

  Linux殭屍程序怎麼殺?在Linux中有一些有些程式即使執行完了任務,還是會留在程序中,此為殭屍程序,留下沒有任何作用,還會持續消耗硬體資源,雖然該程序是無害的,但一直儲存在記憶體中的也是一個問題。

       

什麼是殭屍程序?

  程序的工作原理:我們啟動一個程式,開始我們的任務,然後等任務結束了,我們就停止這個程序。程序停止後,該程序就會從程序表中移除。

  通過 System-Monitor 檢視當前程序。

  

  但是,有時候有些程式即使執行完了也依然留在程序表中。

  那麼,這些完成了生命週期但卻依然留在程序表中的程序,我們稱之為 “殭屍程序”。

殭屍程序如何產生的?

  當你執行一個程式時,它會產生一個父程序以及很多子程序。所有這些子程序都會消耗核心分配給它們的記憶體和 CPU 資源。

  這些子程序完成執行後會傳送一個 Exit 訊號然後死掉。這個 Exit 訊號需要被父程序所讀取。父程序需要隨後呼叫 wait 命令來讀取子程序的退出狀態,並將子程序從程序表中移除。

  若父程序正確第讀取了子程序的 Exit 訊號,則子程序會從程序表中刪掉。

  但若父程序未能讀取到子程序的 Exit 訊號,則這個子程序雖然完成執行處於死亡的狀態,但也不會從程序表中刪掉。

殭屍程序對系統有害嗎?

  不會。由於殭屍程序並不做任何事情,不會使用任何資源也不會影響其它程序,因此存在殭屍程序也沒什麼壞處。不過由於程序表中的退出狀態以及其它一些程序資訊也是儲存在記憶體中的,因此存在太多殭屍程序有時也會是一些問題。

  你可以想象成這樣:

  “你是一家建築公司的老闆。你每天根據工人們的工作量來支付工資。有一個工人每天來到施工現場,就坐在那裡,你不用付錢,他也不做任何工作。 他只是每天都來然後呆坐在那,僅此而已!”

  這個工人就是殭屍程序的一個活生生的例子。但是,如果你有很多殭屍工人,你的建設工地就會很擁堵從而讓那些正常的工人難以工作。

如何找出殭屍程序呢?

  開啟終端並輸入下面命令:

ps aux | grep Z

  會列出程序表中所有殭屍程序的詳細內容。

殭屍程序怎麼殺?

  正常情況下我們可以用 SIGKILL 訊號來殺死程序,但是殭屍程序已經死了,你不能殺死已經死掉的東西。

  因此你需要輸入的命令應該是

kill -s SIGCHLD pid  // pid 為父程序的程序id

  將這裡的 pid 替換成父程序的程序 id,這樣父程序就會刪除所有以及完成並死掉的子程序了。

  你可以把它想象成:

  “你在道路中間發現一輛廢棄的汽車,於是你聯絡了拖車,之後拖車就會將這輛廢棄的汽車帶離道路。” 

  如果程式本身編寫的不是很好,是無法刪掉這些子程序的(否則你一開始也見不到這些殭屍了)。 因此想要快速刪除子程序,只有結束TA們的父程序即可。