絕大多數人對 kill 命令的理解就是結束一個行程,除了這個 kill 其實還有其它的功能,
kill 的作用是向一個行程發送指定信號,而不僅僅是結束一個行程哦!
接下來讓我們詳細的看看 kill 的具體功能,
一、常用引數
語法格式:
kill [引數] <行程ID> [...]
常用引數如下:
-l, --list [信號] :列出信號名稱;
- , -s, --signal <信號> :指定要發送的信號;
二、實體
2.1 -l 引數
引數后不帶信號會列出所有可用信號,如下所示:
linuxy@linuxy:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+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
linuxy@linuxy:~$
接下來看下加了信號的情況,如下所示:
linuxy@linuxy:~$ kill -l 9
KILL
linuxy@linuxy:~$ kill -l 8
FPE
linuxy@linuxy:~$
列出了對應信號的名稱,但是去掉了前綴 SIG,
-l 引數也可以根據信號名稱列出代表的數字,如下所示:
linuxy@linuxy:~$ kill -l 9
KILL
linuxy@linuxy:~$ kill -l KILL
9
linuxy@linuxy:~$ kill -l SIGKILL
9
linuxy@linuxy:~$
2.2 -s 引數
將信號發送給行程,信號可以是名稱或數字,我們常用的是直接 “- 信號” 的形式,而很少用 -s 引數,
注意:“-信號”中的信號可以是數字/信號名稱/不帶前綴SIG的名稱,
為了行程測驗,我們啟動了一個程式 kill-test ,行程號為 3756,如下所示:
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 3756 2577 0 22:39 pts/1 00:00:00 ./kill-test
linuxy 3769 2577 0 22:40 pts/1 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$
先嘗試不帶引數,直接 kill pid,如下所示:
linuxy@linuxy:~$ kill 3756
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 3756 2577 0 22:39 pts/1 00:00:00 ./kill-test
linuxy 3788 2577 0 22:44 pts/1 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$
可以看到程式還在,為什么呢?
在不帶引數情況下,kill 默認發送 TERM 信號到指定行程,TERM 是終止行程信號,程式沒有被結束的原因是程式捕獲了該信號,當然,可以殺死不能捕獲該信號的行程,
那么,對于第一種情況就需要使用 SIGKILL 信號來強制結束行程,如下所示:
linuxy@linuxy:~$ kill -9 3756
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4104 2577 0 22:57 pts/1 00:00:00 grep --color=auto kill-test
[1]+ 已殺死 ./kill-test
linuxy@linuxy:~$
以下使用不同的 “-信號” 形式來結束一個行程,下面是不加 SIG 前綴的情況,如下所示:
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4192 4162 0 23:14 pts/2 00:00:00 ./kill-test
linuxy 4199 4162 0 23:14 pts/2 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$ kill -KILL 4192
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4204 4162 0 23:15 pts/2 00:00:00 grep --color=auto kill-test
[1]+ 已殺死 ./kill-test
linuxy@linuxy:~$
下面是添加 SIG 前綴的情況,如下所示:
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4224 4162 0 23:16 pts/2 00:00:00 ./kill-test
linuxy 4228 4162 0 23:16 pts/2 00:00:00 grep --color=auto kill-test
linuxy@linuxy:~$ kill -SIGKILL 4224
linuxy@linuxy:~$ ps -ef | grep kill-test
linuxy 4235 4162 0 23:17 pts/2 00:00:00 grep --color=auto kill-test
[1]+ 已殺死 ./kill-test
linuxy@linuxy:~$
其它一些常見信號:
SIGHUP : 當 SIGHUP 信號發送給一些守護程式,例如:Apache 和 Sendmail ,在接收到 SIGHUP 信號時會重新讀取組態檔;
SIGCHLD : 在一個行程終止或停止時,SIGCHLD 信號被發送給父行程;
SIGCONT : 該信號發送給需要繼續運行,但當前處于停止狀態的行程;
SIGGIO : 表示一個異步 IO 事件;
SIGSTOP : 這是一個作業控制信號,用于停止一個行程;
注意:除了 SIGKILL 和 SIGSTOP 信號之外,其它的信號都可以被行程所捕獲,
三、總結
在我們日常使用程序中,最常用的便是 SIGTERM 和 SIGKILL 信號來結束一個行程,這兩個信號的區別是,SIGTERM 信號讓程式在結束之前可以做好清理作業,SIGKILL 是強制結束一個行程,該信號不能被捕獲或忽略掉,但是要有對應權限哦!其它信號很少在實際操作中使用到,
參考文獻:
[1] Ubuntu man 手冊
[2] https://en.wikipedia.org/wiki/Kill_(command)
[3] UNIX環境高級編程
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287497.html
標籤:其他
