Kill (命令)

電腦運算中,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信号。一些守护程序,包括ApacheSendmail的,在接收到SIGHUP时重新读取配置文件,因此可用kill命令执行这个功能。在大多数Unix外壳中,只需按下CTRL+C便可以产生SIGINT信号。CTRL+Z也常映射至SIGTSTP,CTRL+\(反斜杠)映射至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). 

外部链接

文件系統
程序
  • at
  • bg
  • chroot
  • cron
  • fg
  • kill
  • killall英语killall
  • nice
  • pgrep
  • pkill英语pkill
  • ps
  • pstree英语pstree
  • time
  • top
用户环境
  • clear
  • env
  • exit
  • history英语history (Unix)
  • id
  • logname
  • mesg英语mesg
  • passwd
  • su
  • sudo
  • uptime
  • talk英语talk (software)
  • tput英语tput
  • uname
  • w
  • wall英语wall (Unix)
  • who
  • whoami
  • write英语write (Unix)
文本编辑
  • awk
  • banner英语banner (Unix)
  • basename
  • comm英语comm
  • csplit英语csplit
  • cut
  • diff
  • dirname
  • ed
  • ex
  • fmt英语fmt
  • fold英语fold (Unix)
  • head英语head (Unix)
  • iconv
  • join英语join (Unix)
  • less
  • more
  • nl英语nl (Unix)
  • paste英语paste (Unix)
  • sed
  • sort英语sort (Unix)
  • spell英语spell (Unix)
  • strings英语strings (Unix)
  • tail
  • tr
  • uniq英语uniq
  • vi
  • wc
  • xargs
壳层内建
网络
查找
文档
  • apropos英语apropos (Unix)
  • help英语help (command)
  • man
软件开发
杂项
  • bc
  • cal
  • dc
  • expr
  • lp英语lp (Unix)
  • lpr
  • sleep
  • true和false
  • yes
文件管理导航
文件管理操作
  • attrib英语ATTRIB
  • cacls
  • cipher
  • compact
  • copy
  • del英语del (command) (erase)
  • deltree英语deltree
  • expand
  • icacls
  • makecab
  • md (mkdir)
  • move英语move (command)
  • rd (rmdir)
  • recover英语recover (command)
  • ren英语ren (command) (rename)
  • replace英语replace (command)
  • Rmdir
  • robocopy英语robocopy
  • xcopy英语XCOPY
磁盘管理
  • chkdsk
  • convert英语convert (command)
  • defrag
  • diskcomp英语diskcomp
  • diskcopy英语diskcopy
  • diskpart英语diskpart
  • fdisk英语fdisk
  • format英语Format (command)
  • label英语label (command)
  • subst英语SUBST
  • scandisk
  • sys英语SYS (command)
  • vol英语vol (command)
  • vssadmin
进程
  • exit
  • kill
  • powercfg英语powercfg
  • runas
  • sc
  • shutdown
  • start英语start (command)
  • taskkill
  • tasklist英语tasklist
注册表
用户环境
  • date
  • mode
  • path
  • set
  • setx
  • time英语TIME (command)
  • title
  • ver英语ver (command)
  • Whoami
文件内容
  • comp英语comp (command)
  • edit英语MS-DOS Editor
  • edlin英语edlin
  • fc英语Microsoft File Compare
  • find英语find (command)
  • findstr
  • print英语PRINT (command)
  • type英语TYPE (DOS command)
脚本
  • choice英语choice (command)
  • clip
  • cscript
  • doskey英语DOSKEY
  • echo
  • for
  • Goto
  • if
  • more
  • pause
  • prompt英语Command-line_interface#Command_prompt
  • rem
网络
维护
启动管理
软件开发
杂项
  • cls
  • help英语help (command)