電腦運算中,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). 

外部連結 編輯