Linux中的kill指令用來終止指定的程序(terminate a process)的運作,是Linux下程序管理的常用指令。工作原理是向Linux系統的核心發送一個系統操作信号和某個程式的程序辨別号,然後系統核心就可以對程序辨別号指定的程序進行操作,通常,終止一個前台程序可以使用Ctrl+C鍵,但是,對于一個背景程序就須用kill指令來終止,我們就需要先使用ps/pgrep/pidof/pstree/top等工具擷取程序PID,然後使用kill指令來殺掉該程序。kill指令是通過向程序發送指定的信号來結束相應程序的。在預設情況下,采用編号為15的TERM信号。TERM信号将終止所有不能捕獲該信号的程序。對于那些可以捕獲該信号的程序就要用編号為9的kill信号,強行“殺掉”該程序。
一、擷取程序PID
1、ps -ef
1
2
3
4
5
6
7
<code>[root@justin conf]</code><code># ps -ef</code>
<code>UID PID PPID C STIME TTY TIME CMD</code>
<code>root 1 0 0 14:09 ? 00:00:02 </code><code>/sbin/init</code>
<code>root 2 0 0 14:09 ? 00:00:00 [kthreadd]</code>
<code>root 3 2 0 14:09 ? 00:00:00 [migration</code><code>/0</code><code>]</code>
<code>root 4 2 0 14:09 ? 00:00:00 [ksoftirqd</code><code>/0</code><code>]</code>
<code>root 5 2 0 14:09 ? 00:00:00 [migration</code><code>/0</code><code>]</code>
2、ps -aux
<code>[root@justin conf]</code><code># ps aux</code>
<code>USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND</code>
<code>root 1 0.4 0.1 2872 1424 ? Ss 14:09 0:02 </code><code>/sbin/init</code>
<code>root 2 0.0 0.0 0 0 ? S 14:09 0:00 [kthreadd]</code>
<code>root 3 0.0 0.0 0 0 ? S 14:09 0:00 [migration</code><code>/0</code><code>]</code>
<code>root 4 0.0 0.0 0 0 ? S 14:09 0:00 [ksoftirqd</code><code>/0</code><code>]</code>
3、精确查找程序PID
3.1通過管道符、grep
<code>[root@localhost ~]</code><code># ps aux|grep firefox</code>
<code>root 2276 3.4 5.7 318708 59268 ? Sl 04:57 0:02 </code><code>/usr/lib/firefox-3</code><code>.6.18</code><code>/firefox-bin</code>
<code>root 2344 0.0 0.0 4356 728 pts</code><code>/0</code> <code>S+ 04:58 0:00 </code><code>grep</code> <code>firefox</code>
<code>[root@localhost ~]</code><code>#</code>
3.2、pgrep
pgrep的p表明了這個指令是專門用于程序查詢的grep
<code>[root@localhost ~]</code><code># pgrep firefox</code>
<code>2276</code>
3.3、pidof--pid of xx
pid of xx,字面翻譯過來就是 xx的PID,和pgrep相比稍顯不足的是,pidof必須給出程序的全名
<code>[root@localhost ~]</code><code># pidof firefox-bin</code>
二、Kill指令結束指定程序
1、指令格式:
kill[參數][程序号pid]
2.指令功能:
發送指定的信号到相應程序。不指定型号将發送SIGTERM(15)終止指定程序。如果任無法終止該程式可用“-KILL” 參數,其發送的信号為SIGKILL(9) ,将強制結束程序,使用ps指令或者jobs 指令可以檢視程序号。root使用者将影響使用者的程序,非root使用者隻能影響自己的程序。
3.指令參數:
-l 信号,若果不加信号的編号參數,則使用“-l”參數會列出全部的信号名稱,eg:[root@localhost ~]# kill -l
-a 當處理目前程序時,不限制指令名和程序号的對應關系
-p 指定kill 指令隻列印相關程序的程序号,而不發送任何信号
-s 指定發送信号
-u 指定使用者
注意:
1、kill指令可以帶信号号碼選項,也可以不帶。如果沒有信号号碼,kill指令就會發出終止信号(15),這個信号可以被程序捕獲,使得程序在退出之前可以清理并釋放資源。也可以用kill向程序發送特定的信号。例如:
kill -2 123
它的效果等同于在前台運作PID為123的程序時按下Ctrl+C鍵。但是,普通使用者隻能使用不帶signal參數的kill指令或最多使用-9信号。
2、應注意,信号使程序強行終止,這常會帶來一些副作用,如資料丢失或者終端無法恢複到正常狀态。發送信号時必須小心,隻有在萬不得已時,才用kill信号(9),因為程序不能首先捕獲它。要撤銷所有的背景作業,可以輸入kill 0。因為有些在背景運作的指令會啟動多個程序,跟蹤并找到所有要殺掉的程序的PID是件很麻煩的事。這時,使用kill 0來終止所有由目前shell啟動的程序,是個有效的方法。
隻有第9種信号(SIGKILL)才可以無條件終止程序,其他信号程序都有權利忽略。下面是常用的信号:
HUP 1 終端斷線,如果想要更改配置而不需停止并重新啟動服務,可以使用zhe個指令
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg指令)
STOP 19 暫停(同 Ctrl + Z)
USR1 通常被用來告知應用程式重載配置檔案;例如,向Apache HTTP伺服器發送一個USR1信号将導緻以下步驟的發生:停止接受新的連接配接,等待目前連接配接停止,重新載入配置檔案,重新打開日志檔案,重新開機伺服器,進而實作相對平滑的不關機的更改。
這些signal可以通過kill -l檢視
8
9
10
11
12
13
14
15
<code>[root@finchina ~]</code><code># kill -l</code>
<code> </code><code>1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP</code>
<code> </code><code>6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1</code>
<code>11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM</code>
<code>16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP</code>
<code>21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ</code>
<code>26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR</code>
<code>31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3</code>
<code>38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8</code>
<code>43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13</code>
<code>48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12</code>
<code>53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7</code>
<code>58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2</code>
<code>63) SIGRTMAX-1 64) SIGRTMAX </code>
<code>[root@finchina ~]</code><code>#</code>
3、init是Linux系統操作中不可缺少的程式之一。所謂的init程序,它是一個由核心啟動的使用者級程序。核心自行啟動(已經被載入記憶體,開始運作,并已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導程序。是以,init始終是第一個程序(其程序編号始終為1)。 其它所有程序都是init程序的子孫。init程序是不可殺的!
4、USR1亦通常被用來告知應用程式重載配置檔案;例如,向Apache HTTP伺服器發送一個USR1信号将導緻以下步驟的發生:停止接受新的連接配接,等待目前連接配接停止,重新載入配置檔案,重新打開日志檔案,重新開機伺服器,進而實作相對平滑的不關機的更改。
<code>kill</code> <code>-USR1 `</code><code>cat</code> <code>/usr/local/nginx/logs/nginx</code><code>.pid`</code>
4、執行個體
4.1終止firefox程序
<code>3049</code>
<code>[root@localhost ~]</code><code># ps -ef|grep firefox</code>
<code>root 3049 1 2 07:36 ? 00:00:00 </code><code>/usr/lib/firefox/firefox</code>
<code>root 3089 2979 0 07:37 pts</code><code>/0</code> <code>00:00:00 </code><code>grep</code> <code>firefox</code>
<code>[root@localhost ~]</code><code># kill 3049</code>
4.2改進1
<code>[root@localhost ~]</code><code># kill -9 $(pgrep firefox)</code>
$( )的用途和反引号` `一樣,用來表示優先執行的指令,這裡的kill -9 $(pgrep firefox)表示先執行pgrep firefox再kill -9 結束該程序
4.3改進2--pkill
pkill=pgrep+kill
<code>[root@localhost ~]</code><code># pkill firefox</code>
<code>[root@localhost ~]</code><code># pkill -9 firefox</code>
"-9" 即發送的信号是9,pkill與kill在這點的差别是:pkill無須 “s”,終止信号等級直接跟在 “-“ 後面。之前我一直以為是 "-s 9",結果每次運作都無法終止程序。
4.3改進3-killall
killall指令殺死同一程序組内的所有程序。其允許指定要終止的程序的名稱,而非PID,和pkill是相似的,不過如果給出的程序名不完整,killall會報錯。pkill或者pgrep隻要給出程序名的一部分就可以終止程序。
<code>[root@localhost ~]</code><code># killall httpd</code>
<code></code>
本文轉自 justin_peng 51CTO部落格,原文連結:http://blog.51cto.com/ityunwei2017/1313927,如需轉載請自行聯系原作者