題 當Ctrl + C無法殺死進程時該怎麼辦?


按Ctrl + C 並不總是能夠殺死當前進程(例如,如果該進程在某些網絡操作中忙碌)。在這種情況下,您只需通過光標看到“^ C”,並且無法執行其他操作。

在不丟失終端的情況下,迫使該過程死亡的最簡單方法是什麼?

答案摘要: 通常,你可以 按Ctrl + ž 讓進程進入睡眠狀態,然後進行 kill -9 _process-pid_,你在哪裡找到進程的pid PS 和其他工具。 上 巴什 (可能還有其他貝殼),你可以做到 kill -9 %1 (或一般來說'%N')更容易。如果 按Ctrl + ž 不起作用,你將不得不打開另一個終端和  從那裡。


145
2018-02-09 08:49


起源


screen 將是一個可能的解決方案,允許您創建一個新的窗口和 kill 從那裡開始的過程。 - Bobby
假設你已經在屏幕上:) - Dustin Boswell


答案:


要了解原因的問題 按Ctrl + C 不起作用,了解按下它時會發生什麼是非常有幫助的:

大多數貝殼綁定 按Ctrl + C 發送一個 SIGINT 發信號到當前在前台運行的程序“。你可以通過讀取不同的信號 男人的信號

 SIGINT        2       Term    Interrupt from keyboard

程序可以忽略該信號,因為它們可以忽略 SIGTSTP 以及:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(當你按下時,大多數貝殼都會這樣做 按Ctrl + ž,這就是為什麼它不能保證工作。)

有一些信號不能被過程忽略: SIGKILLSIGSTOP 和其他一些人。你可以通過發送這些信號  命令。所以,要殺死你的懸掛/殭屍進程,只需找到 進程ID (PID)。例如,使用 pgrep 要么 ps 然後 kill 它:

 % kill -9 PID

102
2018-02-09 09:13



僅僅是一個評論。請注意,“殭屍”在技術上是一個過程狀態,它與“zombieying”在這裡的意思不同。 (一個未被等待的終止進程() - 由其父進行的是殭屍(Z)狀態。在這種情況下,它不能再處理信號了。) - Stéphane Gimenez
唉,有時ctrl + c,ctrl + z和ctrl + \都不做任何事情,並且進程正在運行undo sudo(允許沒有密碼),所以你不能只是向進程發送信號。 - Michael


如果 按Ctrl+C (SIGINT)不起作用,試試 按Ctrl+\ (SIGQUIT)。然後試試 按Ctrl+ž (SIGTSTP)。如果它返回到shell提示符,請執行 kill 在進程ID上。 (默認為SIGTERM信號,您可以使用該信號指定 kill -TERM。在某些貝殼中,您可以使用 %1 引用PID。)如果這不起作用,請轉到另一個終端或SSH會話並執行 kill 要么 kill -TERM 在進程ID上。 只作為最後的手段 你應該這樣做嗎? kill -KILL,a.k.a。 kill -9,因為它沒有給進程任何干淨地中止的機會,同步其打開的文件,刪除其臨時文件,關閉網絡連接等。


97
2018-02-09 09:36





按Ctrl-Z組合鍵 暫停程序並將其置於後台

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(使用重新恢復到前台 fg

然後你可以 kill 要么 kill -9 它,給出它的進程ID(你得到它 ps a)。


27
2018-02-09 08:53



有了bash,你可以 kill $!作為 $! 是一個特殊變量,包含最後一個後台程序的pid。 - Lloeki
@Lloeki對我不起作用(至少不可靠)。我必須 bg 在變量獲得分配值之前。 - Daniel Beck♦
@Daniel,對。就像我說的那樣 轉到後台 過程,因此需要 bg 在Ctrl + Z之後,它只是暫停。 - Lloeki
注意:這不僅僅是一個技巧,使用 ps 輸出(或 killall如果你有多個同名的進程在運行,那麼風險很大。 ps -e -o pid,command 將提供pid +完整args,而不僅僅是程序名稱,但再次可能不足以區別對待。相反 $! 確實很受歡迎。 - Lloeki
@Lloeki我不同意。示例輸出行來自 ps a 在我的系統上: 27721 s000 T 0:00.09 top 暫停了多少(T,我認為)相同命令的實例(top你在同一個tty跑步嗎?s000)? - Daniel Beck♦


看到這個 鏈接 同樣。

按Ctrl+ž:暫停一個過程。

按Ctrl+C:禮貌地要求流程現在關閉。

按Ctrl+\:無情地殺死當前在前台的進程


23
2018-06-19 03:03





通常,您仍然可以停止該過程(按Ctrl + ž)然後使用 kill -9。對於 kill -9,你需要的 過程PID 第一。對於後台工作, kill -9 %1 這是最簡單的方法 - 如果你不確定要殺死的後台作業的數量,運行 jobs

或者,您可以找到進程ID

ps

然後你就可以跑了

kill -9 <Appropriate PID from ps output>

12
2018-02-09 08:53





1)如果您在控制台和多用戶模式下,可以按CTRL-ALT-Fn並在另一個屏幕上登錄,使用 ps -ef | grep <myprocessname> 要么 pidof <myprocessname> 然後按ID號殺死-9進程。

2)如果遠程連接,請通過另一個終端會話執行相同操作。

你也可以通過安裝讓生活變得更輕鬆 HTOP,這是一個更通用的頂級版本,允許您有選擇地殺死正在運行的進程。大多數發行版都在回購中出現。

3)如果你只是陷入一個掛起的ssh會話(例如,到另一個系統),請嘗試按下代號(〜),這是轉義鍵,然後按CTRL-Z退回到主機會話,然後你可以殺死卡住的ssh進程或等待它超時,大多數窗台在一段時間不活動後會這樣做。


4
2018-02-09 09:01





Bash(和其他shell?)的一個更簡單的解決方案是:

Ctrl-z      followed by     kill -9 %1

其中'%1'指的是被殺的工號。如果您已經有其他工作正在休眠,它可能是'%2'(或其他)。按Ctrl-z可以看到它是哪個作業編號:

[1]+  Stopped                 <process name>

請注意,'kill'是shell的kill版本,而不是/ bin / kill。


3
2018-04-18 10:41