使用 kill
命令可以終止進(jìn)程。通常,終止一個(gè)前臺(tái)進(jìn)程可以使用 ctrl+C
鍵,但是對(duì)于一個(gè)后臺(tái)進(jìn)程就必須使用 kill
命令來終止,我們需要先使用 ps/pidof/pstree/top
等工具獲取進(jìn)程 PID,然后使用 kill
命令來殺掉進(jìn)程。kill
命令是通過向進(jìn)程發(fā)送指定的信號(hào)來結(jié)束相應(yīng)進(jìn)程的。在默認(rèn)情況下,采用編號(hào)為 15 的 TREM 信號(hào)。TERM 信號(hào)將終止所有不能獲取該信號(hào)的進(jìn)程。對(duì)于那些可以獲取該信號(hào)的進(jìn)程就要用編號(hào)為 9 的 kill 信號(hào),強(qiáng)行 “殺掉” 該進(jìn)程。
kill 命令詳解
格式:
kill [參數(shù)] [進(jìn)程號(hào),也就是 PID]
功能:
發(fā)送指定的信號(hào)到相應(yīng)進(jìn)程。不指定型號(hào)將發(fā)送 SIFTERM(15)
終止指定進(jìn)程。如果無法終止該進(jìn)程可以使用“-KILL”
參數(shù),其發(fā)送的信號(hào)為 SIGKILL(9)
,將強(qiáng)制結(jié)束進(jìn)程,使用 ps
命令或者 jobs
命令可以查看進(jìn)程號(hào)。root 用戶將影響用戶的進(jìn)程,非 root 用戶只能影響自己的進(jìn)程。
注意:
kill
命令可以帶信號(hào)號(hào)碼選項(xiàng),也可以不帶。如果沒有信號(hào)好嗎,kill
命令就會(huì)發(fā)出終止信號(hào) (15),這個(gè)信號(hào)可以被進(jìn)程捕獲,是的進(jìn)程在推出之前可以清理并釋放資源。也可以用 kill
向進(jìn)程發(fā)送特定的信號(hào)。例如:
kill -2 123
// 它的效果等同于在前臺(tái)運(yùn)行 PID 為 123 的進(jìn)程同時(shí)按下 Ctrl+C
鍵。但是,普通用戶只能使用不帶 signal 參數(shù)的 kill
命令或最多使用 -9 信號(hào)。
kill
可以帶有進(jìn)程 ID 號(hào)作為參數(shù)。當(dāng)用 kill
想這些進(jìn)程發(fā)送信號(hào)時(shí),必須是這些進(jìn)程的主人。如果試圖撤銷一個(gè)沒有撤銷權(quán)限的進(jìn)程或撤銷一個(gè)不存在的進(jìn)程,就會(huì)得到一個(gè)錯(cuò)誤信息。
可以向多個(gè)進(jìn)程發(fā)信號(hào)或終止它們。
當(dāng) kill
成功的發(fā)送了信號(hào)后,shell 會(huì)在屏幕上顯示出進(jìn)程的終止信息。有時(shí)這個(gè)信息不會(huì)馬上顯示,只有當(dāng)按下 Enter
鍵使 shell 的命令提示符再次出現(xiàn)時(shí),才會(huì)顯示出來。
kill
信號(hào) (9),因?yàn)檫M(jìn)程不能首先捕獲它要撤銷所有的后臺(tái)作業(yè),可以輸入 kill 0
。因?yàn)橛行┰诤笈_(tái)運(yùn)行的命令會(huì)啟動(dòng)多個(gè)進(jìn)程,跟蹤并找到所有要?dú)⒌舻倪M(jìn)程的 PID 是件很麻煩的事。這時(shí),使用 kill 0
來終止所有當(dāng)前 shell 啟動(dòng)的進(jìn)程,是個(gè)有效的方法。案例
案例 1:
```#kill -l // 列出所有的信號(hào)名稱
在輸出中,只有第 9 種信號(hào) (SIGKILL) 才可以無條件終止進(jìn)程,其他信號(hào)進(jìn)程都有權(quán)利忽略。以下是常用的信號(hào):
信號(hào)名稱
編號(hào)
說明
HUP
1
終端斷線
INT
2
中斷 (同 Ctrl+C)
QUIT
3
退出 (同 Ctrl)
TERM
15
終止
KILL
9
強(qiáng)制終止
CONT
18
繼續(xù) (與 STOP 相反,fg/bg 命令)
STOP
19
暫停 (同 Ctrl+Z)
案例 2:得到指定信號(hào)的數(shù)值 (不區(qū)分大小寫)
```\#kill -l term
15
\#kill -l kill
9
\#kill -l SIGKILL
案例 3:配合 ps 命令,使用 kill 殺掉進(jìn)程
```#ps -ef | grep vim // 得到關(guān)于 vim 進(jìn)程的 PID,比如得到的 PID 是 111
#kill 111 // 刪除 vim 進(jìn)程
案例 4:徹底殺死進(jìn)程
`\#kill -9 111`
案例 5:殺死指定用戶的所有進(jìn)程
```\#kill -9 $(ps -ef| grep username) // 方法 1
\#kill -u username // 方法 2```
案例 6:init 進(jìn)程 (PID 為 1) 是不可殺的
`\#kill -9 1`
這是因?yàn)?`init` 是 linux 系統(tǒng)中不可缺少的程序之一 。所謂的 `init` 進(jìn)程,他是一個(gè)有內(nèi)核啟動(dòng)的用戶級(jí)進(jìn)程。內(nèi)核自行啟動(dòng) (已經(jīng)被載入內(nèi)存,開始運(yùn)行,并已初始化所有的設(shè)備驅(qū)動(dòng)程序和數(shù)據(jù)結(jié)構(gòu)等) 之后,就通過啟動(dòng)一個(gè)用戶級(jí)程序 `init` 的方式,完成引導(dǎo)進(jìn)程。所以,`init` 時(shí)鐘是第一個(gè)進(jìn)程 (其進(jìn)程編號(hào)始終為 1)。其他所有進(jìn)程都是 `init` 進(jìn)程的子孫。`init` 進(jìn)程是不可殺死的。不夠貌似 `init` 進(jìn)程的作用正在被逐漸弱化。