轉載自https://cloud.tencent.com/developer/article/1847239
首先三個命令都是用於殺掉進程的,不過kill是殺掉單個進程,killall是殺掉所有同名進程,pkill是殺掉一類進程或者某個用戶的所有進程。
我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程,則需要使用ps等命令再配合grep來查找進程。
一、kill命令
kill 命令的用途
kill 命令很容易讓人產生誤解,以為它僅僅就是用來殺死進程的。我們來看一下 man page 對它的解釋:kill - send a signal to a process.從官方的解釋不難看出,kill 是向進程發送信號的命令。當然我們可以向進程發送一個終止運行的信號,此時的 kill 命令才是名至實歸。事實上如果我們不給 kill 命令傳遞信號參數,它默認傳遞終止進程運行的信號給進程!這是 kill 命令最主要的用法,也是本文要介紹的內容。
一般情況下,終止一個前台進程使用 Ctrl + C 就可以了。對於一個后台進程就得用 kill 命令來終止。我們會先使用 ps、top 等命令獲得進程的 PID,然后使用 kill 命令來殺掉該進程。
kill 命令格式
使用kill -l命令列出所有可用的信號。
最常被使用的信號是1/9/15:
1(HUP):重新加載進程。 9 (KILL):殺死進程。 15(TERM):完美地停止一個進程。 kill pid //同下-15默認的安全停止進程 kill -15 pid // kill -9 pid //徹底殺死進程
使用信號 15 是安全的,而信號 9 則是處理異常進程的最后手段,這樣結束掉的進程不會進行資源的清理工作,所以如果你用它來終結掉 vim 的進程,就會發現臨時文件 *.swp 沒有被刪除。
二、killall命令
Linux killall (kill processes by name)用於殺死進程,與 kill 不同的是killall 會殺死指定名字的所有進程。kill 命令殺死指定進程 PID,需要配合 ps 使用,而 killall 直接對進程對名字進行操作,更加方便。
killall -9 mysql //結束所有的 mysql 進程
三、pkill命令
pkill 命令和 killall 命令的用法相同,都是通過進程名殺死一類進程,除此之外,pkill 還有一個更重要的功能,即按照終端號來踢出用戶登錄。
pkill mysql //結束 mysql 進程 pkill -u mark,danny //結束mark,danny用戶的所有進程 w //#使用w命令查詢本機已經登錄的用戶 pkill -9 -t pts/1 //#強制殺死從pts/1虛擬終端登陸的進程
四、拓展命令
如果能看懂下面一系列命令,那么killall 、kill 、pkill三個命令之間的區別你也就了然於胸了。
1、pgrep命令:專門顯示進程的進程號,相當於:
ps -aux | grep 進程名 | grep -v grep| awk '{print $2}'
2、pidof命令:pid of xx進程,顯示進程的進程號,同上pgrep。
3、組合命令的使用:
pgrep mysql | xargs kill -s 9 ps -ef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9 kill -s 9 `pgrep mysql`
看到上面這三條命令的轉換想到了什么嗎,聯想下pkill命令:pkill=pgrep+kill。
pkill與kill在這點的差別是:pkill無須 “s”,終止信號等級直接跟在 “-“ 后面。之前我一直以為是 “-s 9”,結果每次運行都無法終止進程。
killall和pkill是相似的,不過如果給出的進程名不完整,killall會報錯。pkill或者pgrep只要給出進程名的一部分就可以終止進程。