kill (命令)
![本頁使用了標題或全文手工轉換](http://images.weserv.nl/?url=//upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Zh_conversion_icon_m.svg/35px-Zh_conversion_icon_m.svg.png)
在電腦運算中,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).
外部連結
- 命令:單一UNIX®規範第7期,由國際開放標準組織發布 – 命令與工具(Commands & Utilities)參考,
- 系統調用:單一UNIX®規範第7期,由國際開放標準組織發布 – 系統界面(System Interfaces)參考,
|
|