電腦運算中,kill是一個在多種流行作業系統上都可見到的命令,可向執行中的行程傳送訊號,以請求行程終止。

實現

編輯

Unix和類Unix

編輯

Unix類Unix作業系統中,kill是用於向行程傳送訊號命令。預設傳送的訊息是終止訊號,會要求該行程退出。但kill(殺)可能會引起誤解,傳送的訊號可能與行程殺死無關。kill命令是一個包裝了kill()系統呼叫包裝函數,該系統呼叫按行程ID(PID)或行程群組ID(PGID)數,向系統上的行程或行程群組傳送訊號POSIX標準規定kill應作為獨立工具提供。然而,大部分shell都內建了kill的命令,用法可能與標準略有不同[1][2]

可以傳送多種不同的訊號(參見訊號中的完整列表),而一般用戶是最感興趣的是SIGTERMSIGKILL。預設傳送的訊號是SIGTERM。處理這個訊號的程式在退出前可以做一些有用的清理操作(如儲存組態資訊到檔案中)。然而,許多程式並沒有專門處理此訊號的處理程式,因此會呼叫預設的訊號處理常式。而其他情況下,有特殊處理程式的程式也會出錯,從而無法正確處理訊號。

SIGKILLSIGSTOP之外的所有訊號可以為行程所「截獲」,這意味着程式在接收到這些訊號時,可以呼叫特殊函數。兩個例外SIGKILL和SIGSTOP只能由主機系統內核處理,由其負責提供可靠的控制行程執行的方法。SIGKILL會殺死行程,而SIGSTOP可暫停它,直至SIGCONT[3]

UNIX提供了安全機制,以防止未授權用戶殺死其他行程。實質上,若行程欲向另一個行程傳送訊號,發信行程的所有者必須與收信行程的所有者相同,或是超級用戶

可用訊號有着不同的名稱,且對映到特定的數字。注意在不同的Unix實現中,數字和訊號之間的對映關係可以不同。SIGTERM往往為15,而SIGKILL通常編為9。

範例

編輯

可通過以下四種方式傳送SIGTERM訊號(範例行程ID為「1234」):

kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234

可通過三種方式傳送SIGKILL訊號:

kill -s KILL 1234
kill -KILL 1234
kill -9 1234

其它有用的訊號包括HUP、TRAP、INT、SEGV及ALRM。HUP傳送SIGHUP訊號。一些守護程式,包括ApacheSendmail的,在接收到SIGHUP時重新讀取設定檔,因此可用kill命令執行這個功能。在大多數Unix外殼中,只需按下CTRL+C便可以產生SIGINT訊號。CTRL+Z也常對映至SIGTSTPCTRL+\(反斜槓)對映至SIGQUIT,這可強制程式進行核心轉儲

相關程式

編輯
  • killall - 一些Unix變種如Solaris,在關機時會自動呼叫該實用程式。它的功能類似上面的kill命令,但不是向單個行程傳送訊號,而是傳送到系統中的所有行程。然而在其它的作業系統中,如IRIXLinuxFreeBSD,允許通過參數指定要殺死的行程名稱。例如,為了殺死一個行程,如XMMS音樂播放器呼叫的一個xmms實例,用戶可以執行命令killall xmms。這將殺死所有名為xmms的行程,在Solaris系統上等同於kill `pidof xmms`
  • pkill - 根據名稱和其他屬性向行程傳送訊號。它最早出現在Solaris 7中,之後又重新為Linux、NetBSDOpenBSD實現。pkill使得基於名稱殺死行程更加方便:如,要殺死名為firefox的行程,若不使用pkill(及pgrep),必須鍵入kill `ps --no-headers -C firefox -o pid`,而有pkill,只需pkill firefox
  • xkill - 如果不帶任何參數呼叫,滑鼠游標將從箭頭變為「x」圖示,用戶可以單擊一個窗口,強制X伺服器關閉與該窗口客戶端的連接。這往往會導致行程在檢測到它與X伺服器的連接已關閉後終止。

Microsoft Windows

編輯

在微軟的命令列直譯器Windows PowerShell中,預定義的kill是一個Stop-Process cmdlet的命令別名

Microsoft Windows XPVista7中附帶了taskkill命令[4]以終止行程。常見用法為taskkill /im "IMAGENAME"。在Microsoft Windows提供給Windows 98資源工具包中有一個「不受支援」的kill版本[5]

GNU版的kill已通過Cygwin移植,並可以執行在Microsoft Windows Services for UNIX的Unix子環境中(微軟於1999年9月17日通過購買Softway Systems及其Interix產品獲得了Windows Services for UNIX)。[6]

範例

編輯

尋找並殺死所有以字母「P」開頭、由微軟開發、使用主記憶體超過10 MB的行程:

PS C:\>ps p* | where { $_.Company -like "Microsoft*" -and $_.WorkingSet -gt 10MB } | kill -confirm

Confirm
Are you sure you want to perform this action?
Performing operation "Stop-Process" on Target "powershell (6832)".
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"): A
PS C:\>

下面是一個簡單的例子,它要求explorer.exe行程終止:

PS C:\>taskkill /im explorer.exe

強制終止行程:

PS C:\>taskkill /f /im explorer.exe

還可按PID號殺死行程,如下所示:

PS C:\>taskkill /pid 3475

Microsoft Singularity

編輯

微軟研究院微內核作業系統Singularity的標準外殼Singularity shell包含用以終止後台行程的kill命令。

範例

編輯

停止名為「SampleProcess」的行程:

Singularity>kill SampleProcess

停止行程識別碼為「42」的行程:

Singularity>kill 42

貝爾實驗室九號計劃

編輯

貝爾實驗室九號計劃,kill程式不實際執行終止操作,也不需要給予行程ID。相反,它需要行程的實際名稱,並輸出為rc(九號計劃所使用的殼層)的命令來殺死行程。[7]

有一個類似命令slay執行類似操作,但是用於拒絕被這樣殺死的行程。[7]

範例

編輯

殺死所有troff的實例:

kill troff | rc

參見

編輯

參考

編輯
  1. ^ Bash Reference Manual: Job Control Builtins. The GNU Project. [2015-02-24]. (原始內容存檔於2019-09-18). 
  2. ^ zsh: 17. Shell Builtin Commands. [2015-02-24]. (原始內容存檔於2019-09-18). 
  3. ^ <signal.h>. The Open Group Base Specifications Issue 7. [2015-02-24]. (原始內容存檔於2020-12-19). 
  4. ^ Taskkill. Microsoft TechNet. [2015-02-24]. (原始內容存檔於2018-02-03). 
  5. ^ Resource Kit Utilities - Windows '98 Resource Kit. ActiveXperts Software. [2015-02-24]. (原始內容存檔於2019-05-25). 
  6. ^ GNU utilities for Win32. [2015-02-24]. (原始內容存檔於2006-02-09). 
  7. ^ 7.0 7.1 UNIX to Plan 9 command translation. Plan 9 wiki. [2015-02-24]. (原始內容存檔於2008-09-05). 

外部連結

編輯