如何在Linux系統(tǒng)中結(jié)束進(jìn)程或是中止程序
在 Linux 中有幾種使用命令行或圖形界面終止一個程序的方式。
進(jìn)程出錯的時候,您可能會想要中止或是殺掉這個進(jìn)程。在本文中,我們將探索在命令行和圖形界面中終止進(jìn)程或是應(yīng)用程序,這里我們使用 gedit 作為樣例程序。
使用命令行或字符終端界面
Ctrl + C
在命令行中調(diào)用 gedit
(如果您沒有使用 gedit &
命令)程序的一個問題是 shell 會話被阻塞,沒法釋放命令行提示符。在這種情況下,Ctrl + C
(Ctrl
和 C
的組合鍵) 會很管用。這會終止 gedit
,并且所有的工作都將丟失(除非文件已經(jīng)被保存)。Ctrl + C
會給 gedit
發(fā)送了 SIGINT
信號。這是一個默認(rèn)終止進(jìn)程的停止信號,它將指示 shell 停止 gedit
的運(yùn)行,并返回到主函數(shù)的循環(huán)中,您將返回到提示符。
$ gedit
^C
Ctrl + Z
它被稱為掛起字符。它會發(fā)送 SIGTSTP
信號給進(jìn)程。它也是一個停止信號,但是默認(rèn)行為不是殺死進(jìn)程,而是掛起進(jìn)程。
下面的命令將會停止(殺死/中斷) gedit
的運(yùn)行,并返回到 shell 提示符。
$ gedit
^Z
[1]+ Stopped gedit
$
一旦進(jìn)程被掛起(以 gedit
為例),將不能在 gedit
中寫入或做任何事情。而在后臺,該進(jìn)程變成了一個作業(yè),可以使用 jsbs
命令驗證。
$ jobs
[1]+ Stopped gedit
jobs
允許您在單個 shell 會話中控制多個進(jìn)程。您可以終止,恢復(fù)作業(yè),或是根據(jù)需要將作業(yè)移動到前臺或是后臺。
讓我們在后臺恢復(fù) gedit
,釋放提示符以運(yùn)行其它命令。您可以通過 bg
命令來做到,后跟作業(yè) ID(注意上面的 jobs
命令顯示出來的 [1]
,這就是作業(yè) ID)。
$ bg 1
[1]+ gedit &
這和直接使用 gedit &
啟動程序效果差不多:
$ gedit &
使用 kill
kill
命令提供信號的精確控制,允許您通過指定信號名或是信號數(shù)字為進(jìn)程發(fā)送信號,后跟進(jìn)程 ID 或是 PID。
我喜歡 kill
命令的一點(diǎn)是它也能夠根據(jù)作業(yè) ID 控制進(jìn)程。讓我們使用 gedit &
命令在后臺開啟 gedit
服務(wù)。假設(shè)通過 jobs
命令我得到了一個 gedit
的作業(yè) ID,讓我們?yōu)?gedit
發(fā)送 SIGINT
信號:
$ kill -s SIGINT %1
作業(yè) ID 需要使用 %
前綴,不然 kill
會將其視作 PID。
不明確指定信號,kill
仍然可以工作。此時,默認(rèn)會發(fā)送能中斷進(jìn)程的 SIGTERM
信號。執(zhí)行 kill -l
可以查看信號名列表,使用 man kill
命令閱讀手冊。
使用 killall
如果您不想使用特定的工作 ID 或者 PID,killall
允許您使用特定的進(jìn)程名。中斷 gedit
最簡單的 killall
使用方式是:
$ killall gedit
它將終止所有名為 gedit
的進(jìn)程。和 kill
相似,默認(rèn)發(fā)送的信號是 SIGTERM
。使用 -I
選項忽略進(jìn)程名的大小寫。
$ gedit &
[1] 14852
$ killall -I GEDIT
[1]+ Terminated gedit
查看手冊學(xué)習(xí)更多 killall
命令選項(如 -u
)。
使用 xkill
您是否遇見過播放器崩潰,比如 VLC 灰屏或掛起?現(xiàn)在你可以像上面一樣獲得進(jìn)程的 PID 來殺掉它,或者使用 xkill
命令終止應(yīng)用程序。
Using xkill
xkill
允許您使用鼠標(biāo)關(guān)閉窗口。僅需在終端執(zhí)行 xkill
命令,它將會改變鼠標(biāo)光標(biāo)為一個 X 或是一個小骷髏圖標(biāo)。在你想關(guān)閉的進(jìn)程窗口上點(diǎn)擊 x。小心使用 xkill
,如手冊描述的一致,它很危險。我已經(jīng)提醒過您了!
參閱手冊,了解上述命令更多信息。您還可以接續(xù)探索 pkill
和 pgrep
命令。