在Linux中的kill命令简介
1. 概述
有时,进程挂起,我们必须手动终止它们。我们可以通过运行*kill *命令来做到这一点。
在本教程中,我们将介绍四种不同的方法。
请注意,虽然本教程中提到的所有命令都在 Bash 中进行了测试,但它们应该在每个 POSIX 兼容的 shell 中都可用。
2. PID和信号
2.1. 信号
**为了杀死一个进程,我们向它发送一个适当的信号。**信号处理对 Linux 操作系统至关重要。通过信号,我们可以告诉进程该做什么。
在本教程中,我们专注于终止正在运行的进程,但信号也可能用于暂停或继续。查看*signal(7) *手册页以获取 Linux 支持的信号的完整列表。
2.2. PID
要使用kill向进程发送信号,我们需要进程的标识符,简称 PID。进程的 PID 可以通过例如ps 或top 获得,但这超出了本教程的范围。
对于其余部分,假设我们有一个 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