天天看點

RHEL6基礎之十八Linux中Kill程序的方法

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,如需轉載請自行聯系原作者

繼續閱讀