天天看點

菜鳥學Linux指令:kill指令 終止程序

通常,終止一個前台程序可以使用ctrl+c鍵,但是,對于一個背景程序就須用kill指令來終止,我們就需要先使用ps/pidof/pstree/top等工具擷取程序pid,然後使用kill指令來殺掉該程序。

kill指令是通過向程序發送指定的信号來結束相應程序的。

在預設情況下,采用編号為15的term信号。term信号将終止所有不能捕獲該信号的程序。對于那些可以捕獲該信号的程序就要用編号為9的kill信号,強行“殺掉”該程序。

kill[參數][程序号]

發送指定的信号到相應程序。不指定型号将發送sigterm(15)終止指定程序。如果任無法終止該程式可用“-kill” 參數,其發送的信号為sigkill(9) ,将強制結束程序,使用ps指令或者jobs 指令可以檢視程序号。root使用者将影響使用者的程序,非root使用者隻能影響自己的程序。

-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啟動的程序,是個有效的方法。

執行個體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

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

[root@localhost test6]#

執行個體4:徹底殺死程序

kill –9 3268

[root@localhost test6]# kill –9 3268

執行個體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 17565 17534 0 17:38 pts/1 00:00:00 grep init

[root@localhost ~]# kill -kill 1

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

[root@localhost ~]#

init是linux系統操作中不可缺少的程式之一。所謂的init程序,它是一個由核心啟動的使用者級程序。核心自行啟動(已經被載入記憶體,開始運作,并已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導程序。是以,init始終是第一個程序(其程序編号始終為1)。 其它所有程序都是init程序的子孫。init程序是不可殺的!

繼續閱讀