Kill (命令)

在電腦運算中，**<code>kill</code>**是一个在多种流行操作系统上都可见到的命令，可向运行中的行程发送信号，以请求进程终止。

## 实现
### Unix和类Unix
在Unix和类Unix操作系统中，`kill`是用于向进程发送信号的命令。默认发送的消息是终止信号，会要求该进程退出。但*kill*（杀）可能会引起误解，发送的信号可能与进程杀死无关。`kill`命令是一个包装了**<code>kill()</code>**系统调用的包裝函式，该系统调用按进程ID（PID）或进程组ID（PGID）数，向系统上的进程或进程组发送信号。POSIX标准规定`kill`应作为独立工具提供。然而，大部分shell都内置了`kill`的命令，用法可能与标准略有不同。

可以发送多种不同的信号（参见信号中的完整列表），而一般用户是最感兴趣的是SIGTERM和SIGKILL。默认发送的信号是SIGTERM。处理这个信号的程序在退出前可以做一些有用的清理操作（如保存配置信息到文件中）。然而，许多程序并没有专门处理此信号的处理程序，因此会调用默认的信号处理函数。而其他情况下，有特殊处理程序的程序也会出错，从而无法正确处理信号。

除SIGKILL和SIGSTOP之外的所有信号可以为进程所“截获”，这意味着程序在接收到这些信号时，可以调用特殊函数。两个例外SIGKILL和SIGSTOP只能由主机系统内核处理，由其负责提供可靠的控制进程执行的方法。SIGKILL会杀死进程，而SIGSTOP可暂停它，直至SIGCONT。

UNIX提供了安全机制，以防止未授权用户杀死其他进程。实质上，若进程欲向另一个进程发送信号，发信进程的所有者必须与收信进程的所有者相同，或是超级用户。

可用信号有着不同的名称，且映射到特定的数字。注意在不同的Unix实现中，数字和信号之间的映射关系可以不同。SIGTERM往往为15，而SIGKILL通常编为9。

#### 示例
可通过以下四种方式发送SIGTERM信号（示例进程ID为“1234”）：


```bash
kill 1234
kill -s TERM 1234
kill -TERM 1234
kill -15 1234
```


可通过三种方式发送SIGKILL信号：


```bash
kill -s KILL 1234
kill -KILL 1234
kill -9 1234
```


其它有用的信号包括HUP、TRAP、INT、SEGV及ALRM。HUP发送SIGHUP信号。一些守护程序，包括Apache和Sendmail的，在接收到SIGHUP时重新读取配置文件，因此可用kill命令执行这个功能。在大多数Unix外壳中，只需按下便可以产生SIGINT信号。也常映射至SIGTSTP，（反斜杠）映射至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&nbsp;--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`命令以终止进程。常见用法为`taskkill /im "IMAGENAME"`。在Microsoft Windows提供给Windows 98中有一个“不受支持”的`kill`版本。

GNU版的`kill`已通过Cygwin移植，并可以运行在Microsoft Windows Services for UNIX的Unix子环境中（微软于1999年9月17日通过购买Softway Systems及其产品获得了Windows Services for UNIX）。

#### 示例
寻找并杀死所有以字母“P”开头、由微软开发、使用内存超过10 MB的进程：


```ps1con
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进程终止：

```ps1con
PS C:\>taskkill /im explorer.exe
```

强制终止进程：

```ps1con
PS C:\>taskkill /f /im explorer.exe
```

还可按PID号杀死进程，如下所示：

```ps1con
PS C:\>taskkill /pid 3475
```


### Microsoft Singularity
微軟研究院的微內核操作系统Singularity的标准外壳Singularity shell包含用以终止后台进程的`kill`命令。

#### 示例
停止名为“SampleProcess”的进程：


```text
Singularity>kill SampleProcess
```


停止进程标识符为“42”的进程：


```text
Singularity>kill 42
```


### 贝尔实验室九号计划
在貝爾實驗室九號計畫，kill程序不实际执行终止操作，也不需要给予进程ID。相反，它需要进程的实际名称，并输出为rc（九号计划所使用的殼層）的命令来杀死进程。

有一个类似命令`slay`执行类似操作，但是用于拒绝被这样杀死的进程。

#### 示例
杀死所有troff的实例：

 kill troff | rc

## 参见
* 信号
* Xkill
* Killall
* Pkill
* signal.h

## 参考

## 外部链接
* 命令：
* 系统调用：