想像一下:你開啟了一個程式(可能來自於你的桌面選單或者命令列),然後開始使用這個程式,沒想到程式會鎖死、停止執行、或者意外宕機。你嘗試再次執行該程式,但是它反饋說原來的程式沒有完全關閉。
你該怎麼辦?你要結束程式。但該如何做?不管你信與不信,最好的解決方法大都在命令列裡。值得慶幸的是, Linux 有供使用者殺死錯誤的程式的每個必要的工具,然而,你在執行殺死程式的命令之前,你首先需要知道程式是什麼。該如何處理這一類的任務。一旦你能夠掌握這種工具,它實際是十分簡單的……
讓我來介紹給你這些工具。
我來概述的步驟是每個 Linux 發行版都能用的,不論是桌面版還是站群伺服器版。我將限定只使用命令列,請開啟你的終端開始輸入命令吧。
定位程式
殺死一個沒有響應的程式的第一個步驟是定位這個程式。我用來定位程式的命令有兩個:top 和 ps 命令。 top 是每個系統管理員都知道的工具,用 top 命令,你能夠知道到所有當前正在執行的程式有哪些。在命令列裡,輸入 top 命令能夠就看到你正在執行的程式程式(圖 1)
圖 1: top 命令給出你許多的資訊。
從顯示的列表中你能夠看到相當重要的資訊,舉個例子,Chrome 瀏覽器反映遲鈍,依據我們的 top 命令顯示,我們能夠辨別的有四個 Chrome 瀏覽器的程式在執行,程式的 pid 號分別是 3827 、 3919 、 10764 和 11679 。這個資訊是重要的,可以用一個特殊的方法來結束程式。
儘管 top 命令很是方便,但也不是得到你所要資訊最有效的方法。 你知道你要殺死的 Chrome 程式是那個,並且你也不想看 top 命令所顯示的實時資訊。 鑑於此,你能夠使用 ps 命令然後用 grep 命令來過濾出輸出結果。這個 ps 命令能夠顯示出當前程式列表的快照,然後用 grep 命令輸出匹配的樣式。我們透過 grep 命令過濾 ps 命令的輸出的理由很簡單:如果你只輸入 ps 命令,你將會得到當前所有程式的列表快照,而我們需要的是列出 Chrome 瀏覽器程式相關的。所以這個命令是這個樣子:
ps aux | grep chrome
這裡 aux 選項如下所示:
a = 顯示所有使用者的程式
u = 顯示程式的使用者和擁有者
x = 也顯示不依附於終端的程式
當你搜尋圖形化程式的資訊時,這個 x 引數是很重要的。
當你輸入以上命令的時候,你將會得到比圖 2 更多的資訊,而且它有時用起來比 top 命令更有效。
圖 2:用 ps 命令來定位所需的內容資訊。
結束程式
現在我們開始結束程式的任務。我們有兩種可以幫我們殺死錯誤的程式的資訊。
程式的名字
程式的 ID(PID)
你用哪一個將會決定終端命令如何使用,通常有兩個命令來結束程式:
kill – 透過程式 ID 來結束程式
killall – 透過程式名字來結束程式
有兩個不同的訊號能夠傳送給這兩個結束程式的命令。你傳送的訊號決定著你想要從結束程式命令中得到的結果。舉個例子,你可以傳送 HUP(掛起)訊號給結束程式的命令,命令實際上將會重啟這個程式。當你需要立即重啟一個程式(比如就守護程式來說),這是一個明智的選擇。你透過輸入 kill -l 可以得到所有訊號的列表,你將會發現大量的訊號。
圖 3: 可用的結束程式訊號。
最經常使用的結束程式的訊號是:
Signal Name
Single Value
Effect
SIGHUP
1
掛起
SIGINT
2
鍵盤的中斷訊號
SIGKILL
9
發出殺死訊號
SIGTERM
15
發出終止訊號
SIGSTOP
17, 19, 23
停止程式
好的是,你能用訊號值來代替訊號名字。所以你沒有必要來記住所有各種各樣的訊號名字。
所以,讓我們現在用 kill 命令來殺死 Chrome 瀏覽器的程式。這個命令的結構是:
kill SIGNAL PID
這裡 SIGNAL 是要傳送的訊號,PID 是被殺死的程式的 ID 。我們已經知道,來自我們的 ps 命令顯示我們想要結束的程式 ID 號是 3827 、 3919 、 10764 和 11679 。所以要傳送結束程式訊號,我們輸入以下命令:
kill -9 3827
kill -9 3919
kill -9 10764
kill -9 11679
一旦我們輸入了以上命令,Chrome 瀏覽器的所有程式將會成功被殺死。
我們有更簡單的方法!如果我們已經知道我們想要殺死的那個程式的名字,我們能夠利用 killall 命令傳送同樣的訊號,像這樣:
killall -9 chrome
附帶說明的是,上邊這個命令可能不能捕捉到所有正在執行的 Chrome 程式。如果,執行了上邊這個命令之後,你輸入 ps aux | grep chrome 命令過濾一下,看到剩下正在執行的 Chrome 程式有那些,最好的辦法還是回到 kIll 命令透過程式 ID 來傳送訊號值 9 來結束這個程式。
結束程式很容易
正如你看到的,殺死錯誤的程式並沒有你原本想的那樣有挑戰性。當我讓一個頑固的程式結束的時候,我趨向於用 killall 命令來作為有效的方法來終止,然而,當我讓一個真正的活躍的程式結束的時候,kill 命令是一個好的方法。