kill (命令)
實現
Unix和類Unix
在Unix和類Unix作業系統中,kill
是用於向行程傳送訊號的命令。預設傳送的訊息是終止訊號,會要求該行程退出。但kill(殺)可能會引起誤解,傳送的訊號可能與行程殺死無關。kill
命令是一個包裝了kill()
系統呼叫的包裝函數,該系統呼叫按行程ID(PID)或行程群組ID(PGID)數,向系統上的行程或行程群組傳送訊號。POSIX標準規定kill
應作為獨立工具提供。然而,大部分shell都內建了kill
的命令,用法可能與標準略有不同[1][2]。
可以傳送多種不同的訊號(參見訊號中的完整列表),而一般用戶是最感興趣的是SIGTERM和SIGKILL。預設傳送的訊號是SIGTERM。處理這個訊號的程式在退出前可以做一些有用的清理操作(如儲存組態資訊到檔案中)。然而,許多程式並沒有專門處理此訊號的處理程式,因此會呼叫預設的訊號處理常式。而其他情況下,有特殊處理程式的程式也會出錯,從而無法正確處理訊號。
除SIGKILL和SIGSTOP之外的所有訊號可以為行程所「截獲」,這意味着程式在接收到這些訊號時,可以呼叫特殊函數。兩個例外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訊號。一些守護程式,包括Apache和Sendmail的,在接收到SIGHUP時重新讀取設定檔,因此可用kill命令執行這個功能。在大多數Unix外殼中,只需按下CTRL+C便可以產生SIGINT訊號。CTRL+Z也常對映至SIGTSTP,CTRL+\(反斜槓)對映至SIGQUIT,這可強制程式進行核心轉儲。
相關程式
- killall - 一些Unix變種如Solaris,在關機時會自動呼叫該實用程式。它的功能類似上面的kill命令,但不是向單個行程傳送訊號,而是傳送到系統中的所有行程。然而在其它的作業系統中,如IRIX、Linux及FreeBSD,允許通過參數指定要殺死的行程名稱。例如,為了殺死一個行程,如XMMS音樂播放器呼叫的一個
xmms
實例,用戶可以執行命令killall xmms
。這將殺死所有名為xmms
的行程,在Solaris系統上等同於kill `pidof xmms`
。 - pkill - 根據名稱和其他屬性向行程傳送訊號。它最早出現在Solaris 7中,之後又重新為Linux、NetBSD及OpenBSD實現。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 XP、Vista和7中附帶了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
參見
參考
- ^ Bash Reference Manual: Job Control Builtins. The GNU Project. [2015-02-24]. (原始內容存檔於2019-09-18).
- ^ zsh: 17. Shell Builtin Commands. [2015-02-24]. (原始內容存檔於2019-09-18).
- ^ <signal.h>. The Open Group Base Specifications Issue 7. [2015-02-24]. (原始內容存檔於2020-12-19).
- ^ Taskkill. Microsoft TechNet. [2015-02-24]. (原始內容存檔於2018-02-03).
- ^ Resource Kit Utilities - Windows '98 Resource Kit. ActiveXperts Software. [2015-02-24]. (原始內容存檔於2019-05-25).
- ^ GNU utilities for Win32. [2015-02-24]. (原始內容存檔於2006-02-09).
- ^ 7.0 7.1 UNIX to Plan 9 command translation. Plan 9 wiki. [2015-02-24]. (原始內容存檔於2008-09-05).