在電腦運算 中,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”的进程:
贝尔实验室九号计划
在貝爾實驗室九號計畫 ,kill程序不实际执行终止操作,也不需要给予进程ID。相反,它需要进程的实际名称,并输出为rc (九号计划所使用的殼層 )的命令来杀死进程。[ 7]
有一个类似命令slay
执行类似操作,但是用于拒绝被这样杀死的进程。[ 7]
示例
杀死所有troff 的实例:
kill troff | rc
参见
参考
外部链接
文件管理导航 文件管理操作 磁盘管理 进程 注册表 用户环境 文件内容 脚本 网络 维护 启动管理 软件开发 杂项