每天一個 Linux 命令:kill 命令

Linux 中的kill命令用來終止指定的進程(terminate a process)的運行,是 Linux 下進程管理的常用命令。通常,終止一個前臺進程可以使用 Ctrl+C 鍵,但是,對於一個後臺進程就須用kill命令來終止,我們就需要先使用 ps/pidof/pstree/top 等工具獲取進程 PID,然後使用 kill 命令來殺掉該進程。kill 命令是通過向進程發送指定的信號來結束相應進程的。在默認情況下,採用編號爲 15 的 TERM 信號。TERM 信號將終止所有不能捕獲該信號的進程。對於那些可以捕獲該信號的進程就要用編號爲 9 的 kill 信號,強行 “殺掉” 該進程。

1.命令格式:

kill[參數][進程號]

2.命令功能:

發送指定的信號到相應進程。不指定型號將發送 SIGTERM(15)終止指定進程。如果任無法終止該程序可用 “-KILL” 參數,其發送的信號爲 SIGKILL(9) ,將強制結束進程,使用 ps 命令或者 jobs 命令可以查看進程號。root 用戶將影響用戶的進程,非 root 用戶只能影響自己的進程。

3.命令參數:

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

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

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

-s 指定發送信號

-u 指定用戶

注意:

1、kill 命令可以帶信號號碼選項,也可以不帶。如果沒有信號號碼,kill 命令就會發出終止信號 (15),這個信號可以被進程捕獲,使得進程在退出之前可以清理並釋放資源。也可以用 kill 向進程發送特定的信號。例如:

kill -2 123

它的效果等同於在前臺運行 PID 爲 123 的進程時按下 Ctrl+C 鍵。但是,普通用戶只能使用不帶 signal 參數的 kill 命令或最多使用 - 9 信號。

2、kill 可以帶有進程 ID 號作爲參數。當用 kill 向這些進程發送信號時,必須是這些進程的主人。如果試圖撤銷一個沒有權限撤銷的進程或撤銷一個不存在的進程,就會得到一個錯誤信息。

3、可以向多個進程發信號或終止它們。

4、當 kill 成功地發送了信號後,shell 會在屏幕上顯示出進程的終止信息。有時這個信息不會馬上顯示,只有當按下 Enter 鍵使 shell 的命令提示符再次出現時,纔會顯示出來。

5、應注意,信號使進程強行終止,這常會帶來一些副作用,如數據丟失或者終端無法恢復到正常狀態。發送信號時必須小心,只有在萬不得已時,才用 kill 信號 (9),因爲進程不能首先捕獲它。要撤銷所有的後臺作業,可以輸入 kill 0。因爲有些在後臺運行的命令會啓動多個進程,跟蹤並找到所有要殺掉的進程的 PID 是件很麻煩的事。這時,使用 kill 0 來終止所有由當前 shell 啓動的進程,是個有效的方法。

4.使用實例:

實例 1:列出所有信號名稱

命令:

kill -l

輸出:

 [root@localhost test6]# 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

說明:

只有第 9 種信號 (SIGKILL) 纔可以無條件終止進程,其他信號進程都有權利忽略。

下面是常用的信號:

HUP  1  終端斷線

INT   2  中斷(同 Ctrl + C)

QUIT  3  退出(同 Ctrl + \)

TERM  15  終止

KILL  9  強制終止

CONT  18  繼續(與 STOP 相反, fg/bg 命令)

STOP  19  暫停(同 Ctrl + Z)

實例 2:得到指定信號的數值

命令:

輸出:

 [root@localhost test6]# kill -l KILL

 9[root@localhost test6]# kill -l SIGKILL

 9[root@localhost test6]# kill -l TERM

 15[root@localhost test6]# kill -l SIGTERM

 15[root@localhost test6]#

實例 3:先用 ps 查找進程,然後用 kill 殺掉

命令:

kill 3268

輸出:

 [root@localhost test6]# ps -ef|grep vim 

 root   3268 2884 0 16:21 pts/1  00:00:00 vim install.log

 root   3370 2822 0 16:21 pts/0  00:00:00 grep vim

 [root@localhost test6]# kill 3268 

 [root@localhost test6]# kill 3268 

 -bash: kill: (3268) - 沒有那個進程

 [root@localhost test6]#

實例 4:徹底殺死進程

命令:

kill –9 3268

輸出:

 [root@localhost test6]# ps -ef|grep vim 

 root   3268 2884 0 16:21 pts/1  00:00:00 vim install.log

 root   3370 2822 0 16:21 pts/0  00:00:00 grep vim

 [root@localhost test6]# kill –9 3268 

 [root@localhost test6]# kill 3268 

 -bash: kill: (3268) - 沒有那個進程

 [root@localhost test6]#

實例 5:殺死指定用戶所有進程

命令:

kill -9 $(ps -ef | grep peidalinux)

kill -u peidalinux

輸出:

 [root@localhost ~]# kill -9 $(ps -ef | grep peidalinux) 

 [root@localhost ~]# kill -u peidalinux

說明:

方法一,過濾出 hnlinux 用戶進程並殺死

實例 6:init 進程是不可殺的

命令:

kill -9 1

輸出:

 [root@localhost ~]# ps -ef|grep init

 root     1   0 0 Nov02 ?    00:00:00 init [3]         

 root   17563 17534 0 17:37 pts/1  00:00:00 grep init

 [root@localhost ~]# kill -9 1

 [root@localhost ~]# kill -HUP 1

 [root@localhost ~]# ps -ef|grep init

 root     1   0 0 Nov02 ?    00:00:00 init [3]         

 root   17565 17534 0 17:38 pts/1  00:00:00 grep init

 [root@localhost ~]# kill -KILL 1

 [root@localhost ~]# ps -ef|grep init

 root     1   0 0 Nov02 ?    00:00:00 init [3]         

 root   17567 17534 0 17:38 pts/1  00:00:00 grep init

 [root@localhost ~]#

說明:

init 是 Linux 系統操作中不可缺少的程序之一。所謂的 init 進程,它是一個由內核啓動的用戶級進程。內核自行啓動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之後,就通過啓動一個用戶級程序 init 的方式,完成引導進程。所以,init 始終是第一個進程(其進程編號始終爲 1)。其它所有進程都是 init 進程的子孫。init 進程是不可殺的!

轉自:www.cnblogs.com/peida/archive/12/20/2825837.html

****推薦關注「算法愛好者」,修煉編程內功

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/C_ZPiKGpbGaBILDNBQOnxQ