首先查看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在執行時,應用程序是沒有時間進行"準備工作"的,所以這通常會帶來一些副作用,數據丟失或者終端無法恢復到正常狀態等。