Contents

在Linux中的kill命令简介

1. 概述

有时,进程挂起,我们必须手动终止它们。我们可以通过运行*kill *命令来做到这一点。

在本教程中,我们将介绍四种不同的方法。

请注意,虽然本教程中提到的所有命令都在 Bash 中进行了测试,但它们应该在每个 POSIX 兼容的 shell 中都可用。

2. PID和信号

2.1. 信号

**为了杀死一个进程,我们向它发送一个适当的信号。**信号处理对 Linux 操作系统至关重要。通过信号,我们可以告诉进程该做什么。

在本教程中,我们专注于终止正在运行的进程,但信号也可能用于暂停或继续。查看*signal(7) *手册页以获取 Linux 支持的信号的完整列表。

2.2. PID

要使用kill向进程发送信号,我们需要进程的标识符,简称 PID。进程的 PID 可以通过例如pstop 获得,但这超出了本教程的范围。

对于其余部分,假设我们有一个 PID 为 123 的挂起进程。请注意,虽然我们将在示例中使用单个 PID,但我们始终可以通过提供空格来向多个进程发送相同的信号-分隔的 PID 字符串。

3. SIGTERM (15)

kill的默认行为是向进程发送 SIGTERM 信号,通过该信号我们要求该进程正常关闭。

由于它是默认行为,我们可以通过简单地提供其 PID 来调用kill进程:

kill 123

要显式发送 SIGTERM 信号,我们使用:

kill -s SIGTERM 123

我们可以通过使用信号 id 进一步缩短它:

kill -15 123

在以下示例中,我们将使用这种短格式,以便熟悉数值。

4. SIGQUIT (3)

向进程发送 SIGQUIT 信号与使用 SIGTERM 要求它关闭相同。不同之处在于 SIGQUIT 使操作系统执行所谓的核心转储:

kill -3 123

核心转储是我们发送终止信号时进程工作内存的快照,默认情况下将写入当前工作目录。

我们可以使用核心转储进行调试。

请注意,虽然退出是默认行为,但 Java 是一个不使用 SIGQUIT 退出的进程示例,它仅执行核心转储

5. SIGKILL (9)

通过程序员的选择,进程不必响应每个信号。

在这种情况下,或者对于占用 CPU 的进程,我们可以使用 SIGKILL 信号强制它终止:

kill -9 123

使用 SIGKILL 我们要求内核立即关闭进程。该过程死亡并且不会自行清理。

这意味着存在数据丢失甚至更糟的数据损坏的风险。

现在,虽然 SIGTERM、SIGQUIT 和 SIGKILL 肯定是最常见的,但我们还有一个信号要查看:SIGSTOP。

6. 信号停止 (19)

与名称可能暗示的不同,SIGSTOP 信号不会终止进程。这相当于使用 ctrl+z 停止进程并将其置于后台。

我们停止一个程序:

kill -19 123

该过程可以通过发送继续信号 SIGCONT (18) 来恢复:

kill -18 123