終止一個進程或終止一個正在運行的程序,一般是通過kill 、killall、pkill、xkill 等進行。比如一個程序已經死掉,但又不能退出,這時就應該考慮應用這些工具。
另外應用的場合就是在服務器管理中,在不涉及數據庫服務器程序的父進程的停止運行,也可以用這些工具來終止。為什么數據庫服務器的父進程不能用這些工具殺死呢?原因很簡單,這些工具在強行終止數據庫服務器時,會讓數據庫產生更多的文件碎片,當碎片達到一定程度的時候,數據庫就有崩潰的危險。比如mysql 服務器最好是按其正常的程序關閉,而不是用pkill mysqld 或killall mysqld 這樣危險的動作;當然對於占用資源過多的數據庫子進程,我們應該用kill 來殺掉。
1. kill
kill的應用是和ps 或pgrep 命令結合在一起使用的;
killall命令使用進程的名稱來殺死進程,使用此指令可以殺死一組同名進程。我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,我們還需要在之前使用ps等命令再配合grep來查找進程,而killall把這兩個過程合二為一,是一個很好用的命令。
1.命令格式:
killall[參數][進程名]
2.命令功能:
用來結束同名的的所有進程
3.命令參數:
-Z 只殺死擁有scontext 的進程
-e 要求匹配進程名稱
-I 忽略小寫
-g 殺死進程組而不是進程
-i 交互模式,殺死進程前先詢問用戶
-l 列出所有的已知信號名稱
-q 不輸出警告信息
-s 發送指定的信號
-v 報告信號是否成功發送
-w 等待進程死亡
--help 顯示幫助信息
--version 顯示版本顯示
-e:對長名稱進行精確匹配; -l:忽略大小寫的不同; -p:殺死進程所屬的進程組; -i:交互式殺死進程,殺死進程前需要進行確認; -l:打印所有已知信號列表; -q:如果沒有進程被殺死。則不輸出任何信息; -r:使用正規表達式匹配要殺死的進程名稱; -s:用指定的進程號代替默認信號“SIGTERM”; -u:殺死指定用戶的進程。
實例1:殺死所有同名進程
命令:killall vi
實例2:向進程發送指定信號
命令:
后台運行程序:vi &
殺死 vi進程:killall -TERM vi 或者 killall -KILL vi
實例3:把所有的登錄后的shell給殺掉
命令:killall -9 bash
說明:運行命令:killall -9 bash 后,所有bash都會被卡掉了,所以當前所有連接丟失了。需要重新連接並登錄。
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啟動的進程,是個有效的方法。
實例1:列出所有信號名稱
命令:kill -l
說明:
只有第9種信號(SIGKILL)才可以無條件終止進程,其他信號進程都有權利忽略。 下面是常用的信號:
HUP 1 終端斷線
INT 2 中斷(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 終止
KILL 9 強制終止
CONT 18 繼續(與STOP相反, fg/bg命令)
STOP 19 暫停(同 Ctrl + Z)
實例5:殺死指定用戶所有進程
命令:
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux
說明:方法一,過濾出hnlinux用戶進程並殺死
實例6:init進程是不可殺的
命令:kill -9 1
說明:init是Linux系統操作中不可缺少的程序之一。所謂的init進程,它是一個由內核啟動的用戶級進程。內核自行啟動(已經被載入內存,開始運行,並已初始化所有的設備驅動程序和數據結構等)之后,就通過啟動一個用戶級程序init的方式,完成引導進程。所以,init始終是第一個進程(其進程編號始終為1)。 其它所有進程都是init進程的子孫。init進程是不可殺的!
3、 pkill
pkill 和killall 應用方法差不多,也是直接殺死運行中的程式;如果你想殺掉單個進程,請用kill 來殺掉。
應用方法:
#pkill 正在運行的程式名
-o:僅向找到的最小(起始)進程號發送信號; -n:僅向找到的最大(結束)進程號發送信號; -P:指定父進程號發送信號; -g:指定進程組; -t:指定開啟進程的終端。
4 、xkill
xkill 是在桌面用的殺死圖像界面的程式。比如當firefox 出現崩潰不能退出時,點鼠標就能殺死firefox 。當xkill運行時出來和個人腦骨的圖標,哪個圖像程式崩潰一點就OK了。如果你想終止xkill ,就按右鍵取消;
xkill 調用方法:
[vivian@localhost vivian]$ xkill
