1. 程式人生 > >kill及kill -9的用法及如何實現程序的優雅退出

kill及kill -9的用法及如何實現程序的優雅退出

 kill pid與kill -9 pid的區別         kill pid的作用是向程序號為pid的程序傳送SIGTERM(這是kill預設傳送的訊號),該訊號是一個結束程序的訊號且可以被應用程式捕獲。若應用程式沒有捕獲並響應該訊號的邏輯程式碼,則該訊號的預設動作是kill掉程序。這是終止指定程序的推薦做法。
          kill -9 pid則是向程序號為pid的程序傳送SIGKILL(該訊號的編號為9),從本文上面的說明可知,SIGKILL既不能被應用程式捕獲,也不能被阻塞或忽略,其動作是立即結束指定程序。通俗地說,應用程式根本無法“感知”SIGKILL訊號,它在完全無準備的情況下,就被收到SIGKILL訊號的作業系統給幹掉了,顯然,在這種“暴力”情況下,應用程式完全沒有釋放當前佔用資源的機會。事實上,SIGKILL訊號是直接發給init程序的,它收到該訊號後,負責終止pid指定的程序。在某些情況下(如程序已經hang死,無法響應正常訊號),就可以使用kill -9來結束程序。         若通過kill結束的程序是一個建立過子程序的父程序,則其子程序就會成為孤兒程序(Orphan Process),這種情況下,子程序的退出狀態就不能再被應用程序捕獲(因為作為父程序的應用程式已經不存在了),不過應該不會對整個linux系統產生什麼不利影響。 3. 應用程式如何優雅退出        
Linux
Server端的應用程式經常會長時間執行,在執行過程中,可能申請了很多系統資源,也可能儲存了很多狀態,在這些場景下,我們希望程序在退出前,可以釋放資源或將當前狀態dump到磁碟上或列印一些重要的日誌,也就是希望程序優雅退出(exit gracefully)。         從上面的介紹不難看出,優雅退出可以通過捕獲SIGTERM來實現。具體來講,通常只需要兩步動作:         1)註冊SIGTERM訊號的處理函式並在處理函式中做一些程序退出的準備。訊號處理函式的註冊可以通過signal()或sigaction()來實現,其中,推薦使用後者來實現訊號響應函式的設定。訊號處理函式的邏輯越簡單越好,通常的做法是在該函式中設定一個bool型的flag變數以表明程序收到了SIGTERM訊號,準備退出。
          2)在主程序的main()中,通過類似於while(!bQuit)的邏輯來檢測那個flag變數,一旦bQuit在signal handler function中被置為true,則主程序退出while()迴圈,接下來就是一些釋放資源或dump程序當前狀態或記錄日誌的動作,完成這些後,主程序退出。