linux: kill -9

首先查看kill信號

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGEMT       8) SIGFPE       9) SIGKILL     10) SIGBUS
11) SIGSEGV     12) SIGSYS      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGURG      17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGPWR      30) SIGUSR1
31) SIGUSR2     32) SIGRTMIN    33) SIGRTMIN+1  34) SIGRTMIN+2  35) SIGRTMIN+3
36) SIGRTMIN+4  37) SIGRTMIN+5  38) SIGRTMIN+6  39) SIGRTMIN+7  40) SIGRTMIN+8
41) SIGRTMIN+9  42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13
46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMIN+16 49) SIGRTMAX-15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4
61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1  64) SIGRTMAX

在Linux中終止一個進程有兩種方式,如果是前臺進程可以使用Ctrl+C鍵進行終止(kill -2);如果是後臺進程,那麼需要使用kill命令來終止。

kill的命令參數有以下幾種:

-l 信號,若果不加信號的編號參數,則使用“-l”參數會列出全部的信號名稱

-a 當處理當前進程時,不限制命令名和進程號的對應關係

-p 指定kill 命令只打印相關進程的進程號,而不發送任何信號

-s 指定發送信號

-u 指定用戶

通常情況下,我們使用的-l(信號)的時候比較多,如我們前文提到的kill -9中的9就是信號。

信號如果沒有指定的話,默認會發出終止信號(15)。常用的信號如下

HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)

比較常用的就是強制終止信號:9終止信號:15,另外,中斷信號:2其實就是我們前文提到的Ctrl + C結束前臺進程。


kill -9 和 kill -15的區別

kill命令默認的信號就是15,首先來說一下這個默認的kill -15信號。

當使用kill -15時,系統會發送一個SIGTERM的信號給對應的程序。當程序接收到該信號後,具體要如何處理是自己可以決定的。

這時候,應用程序可以選擇:

  • 1、立即停止程序

  • 2、釋放響應資源後停止程序

  • 3、忽略該信號,繼續執行程序

因爲kill -15信號只是通知對應的進程要進行"安全、乾淨的退出",程序接到信號之後,退出前一般會進行一些"準備工作",如資源釋放、臨時文件清理等等,如果準備工作做完了,再進行程序的終止。

但是,如果在"準備工作"進行過程中,遇到阻塞或者其他問題導致無法成功,那麼應用程序可以選擇忽略該終止信號。

這也就是爲什麼我們有的時候使用kill命令是沒辦法"殺死"應用的原因,因爲默認的kill信號是SIGTERM(15),而SIGTERM(15)的信號是可以被阻塞和忽略的。

kill -15相比,kill -9就相對強硬一點,系統會發出SIGKILL信號,他要求接收到該信號的程序應該立即結束運行,不能被阻塞或者忽略。

所以,相比於kill -15命令,kill -9在執行時,應用程序是沒有時間進行"準備工作"的,所以這通常會帶來一些副作用,數據丟失或者終端無法恢復到正常狀態等。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章