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.說明
進程是Linux系統中一個非常重要的概念。Linux是一個多任務的操作系統,系統上經常同時運行着多個進程。我們不關心這些進程究竟是如何分配的,或者是內核如何管理分配時間片的,所關心的是如何去控制這些進程,讓它們能夠很好地爲用戶服務。
Linux操作系統包括三種不同類型的進程,每種進程都有自己的特點和屬性。交互進程是由一個Shell啓動的進程。交互進程既可以在前臺運行,也可以在後臺運行。批處理進程和終端沒有聯繫,是一個進程序列。監控進程(也稱系統守護進程)時Linux系統啓動時啓動的進程,並在後臺運行。例如,httpd是著名的Apache服務器的監控進程。
kill命令的工作原理是,向Linux系統的內核發送一個系統操作信號和某個程序的進程標識號,然後系統內核就可以對進程標識號指定的進程進行操作。比如在top命令中,我們看到系統運行許多進程,有時就需要使用kill中止某些進程來提高系統資源。在講解安裝和登陸命令時,曾提到系統多個虛擬控制檯的作用是當一個程序出錯造成系統死鎖時,可以切換到其它虛擬控制檯工作關閉這個程序。此時使用的命令就是kill,因爲kill是大多數Shell內部命令可以直接調用的。

5.使用實例:

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

命令:

kill -l

輸出:

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

說明:

只有第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 ~]# kill -l KILL
9
[root@localhost ~]# kill -l SIGKILL
9
[root@localhost ~]# kill -l TERM
15
[root@localhost ~]# kill -l SIGQUIT
3
[root@localhost ~]# 

說明:

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

命令:

kill 593

輸出:

[root@localhost ~]# ps -ef|grep vim
root       593   574  5 02:22 pts/2    00:00:00 grep vim
[root@localhost ~]# 

說明:

實例4:徹底殺死進程

命令:

kill –9 593 


說明:

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

命令:

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

kill -u peidalinux


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

命令:

kill -9 1

輸出:

[root@localhost ~]# ps -ef|grep init
root         1     0  0 May15 ?        00:00:02 /sbin/init
root       617   601  0 02:26 pts/2    00:00:00 grep init
[root@localhost ~]# 

說明:

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


*殺死進程最安全的方法是單純使用kill命令,不加修飾符,不帶標誌。


首先使用ps -ef命令確定要殺死進程的PID,然後輸入以下命令:
# kill -pid
註釋:標準的kill命令通常都能達到目的。終止有問題的進程,並把進程的資源釋放給系統。然而,如果進程啓動了子進程,只殺死父進程,子進程仍在運行,因此仍消耗資源。爲了防止這些所謂的“殭屍進程”,應確保在殺死父進程之前,先殺死其所有的子進程。
*確定要殺死進程的PID或PPID
# ps -ef | grep httpd
*以優雅的方式結束進程
# kill -l PID
-l選項告訴kill命令用好像啓動進程的用戶已註銷的方式結束進程。當使用該選項時,kill命令也試圖殺死所留下的子進程。但這個命令也不是總能成功--或許仍然需要先手工殺死子進程,然後再殺死父進程。
*TERM信號
給父進程發送一個TERM信號,試圖殺死它和它的子進程。
# kill -TERM PPID
*killall命令
killall命令殺死同一進程組內的所有進程。其允許指定要終止的進程的名稱,而非PID。
# killall httpd
*停止和重啓進程
有時候只想簡單的停止和重啓進程。如下:
# kill -HUP PID
該命令讓Linux和緩的執行進程關閉,然後立即重啓。在配置應用程序的時候,這個命令很方便,在對配置文件修改後需要重啓進程時就可以執行此命令。
*絕殺 kill -9 PID
同意的 kill -s SIGKILL
這個強大和危險的命令迫使進程在運行時突然終止,進程在結束後不能自我清理。危害是導致系統資源無法正常釋放,一般不推薦使用,除非其他辦法都無效。
當使用此命令時,一定要通過ps -ef確認沒有剩下任何殭屍進程。只能通過終止父進程來消除殭屍進程。如果殭屍進程被init收養,問題就比較嚴重了。殺死init進程意味着關閉系統。
如果系統中有殭屍進程,並且其父進程是init,而且殭屍進程佔用了大量的系統資源,那麼就需要在某個時候重啓機器以清除進程表了。
發佈了39 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章