如何在 Linux 中使用 SIGINT 和其他终止信号

您必须习惯使用 Ctrl + C 来终止任何进程,但您知道它会发送 SIGINT 信号?

但是有更多类型的终止信号,而不仅仅是使用 SIGINT (咳嗽 Ctrl + c 咳嗽)。 因此,让我们深入了解终端信号的海洋!!

在 Linux 中使用终止信号

kill 命令是用户通常用于终止的命令,但您知道 50 多个信号 kill 命令对您有用吗?

这意味着您可以使用这些数字而不是编写信号名称。

为了 example,如果你想停止执行,你最有可能使用 SIGTSTP 像这样:

kill -SIGTSTP %jobID

同样,您可以使用 20 因为它与 SIGTSTP 达到同样的效果:

kill -20 %jobID
使用带有信号的关联数字来终止进程

但是有太多的选项,所以我将介绍广泛使用的选项。

所以让我们从 SIGSTOP.

使用 SIGTSTP 终止进程

首先,让我从杀戮前台进程说起。

与杀死后台进程相比,这非常简单,因为您只需要相应地使用键绑定即可。

执行键绑定 SIGTSTOPctrl + z. 为了 example,我将使用 sleep 命令:

sleep 15000
使用带有 kill 的 SIGTSTP 来终止前台进程

在这里你可以看到我已经使用了 jobs 命令,一个有用的实用程序,显示正在运行和最近终止的进程。

但是后台进程呢? 那么,你需要使用指定 PID 或 JOB ID 的 kill 命令 -SIGTSTOP.

kill -SIGSTP %jobID
使用带有 kill 的 SIGTSTP 来终止后台进程

使用 SIGCONT 恢复命令执行

有时您想恢复最近终止的命令执行,在这种情况下, -SIGCONT 会帮助你。

为了这 example,我将使用先前终止的进程,然后使用给定的命令恢复其执行:

kill -SIGCONT %jobID
使用 SIGCONT 恢复终止的进程

使用 SIGINT 终止执行

这是我一直以来最喜欢的命令,因为每当我发现自己卡在某个地方时, ctrl + c 为我创造奇迹。

如果您不知道这一点,让我向您展示它如何轻松终止命令执行:

使用 SIGINT 和 kill 来终止前台进程

但问题是 SIGINT 它在某些地方可能不起作用,例如 bash 口译员。

为了 example,这是一个 bash 接受用户输入的脚本:

#!/bin/bash

trap date SIGINT

read input
echo User input: $input
echo Exiting now
bash  显示 SIGINT 的脚本可能不适用于某些情况

如您所见,当我按下时,它给了我当前的日期和时间 ctrl + c 只有当它从我这边得到输入时才停止。

我知道这个脚本是用这种方式创建的,但你说得对。 你不能依赖 SIGINT 总是。

使用 SIGQUIT 终止

SIGQUIT 与 SIGINT 类似,但它还在执行前生成核心转储。

简单来说,核心转储是在系统崩溃或进程终止之前自动生成的文件。

此外,它可以通过使用 ctrl + . 所以你可以用它来终止前台和后台进程。

因此,让我向您展示当您仅尝试时它的行为方式 ctrl +

使用 SIGQUIT with 来终止前台进程

但是如何使用它来终止后台进程呢? 让我来介绍一下语法部分以使其更容易:

kill -SIGQUIT %jobID
使用 SIGQUIT with 来终止后台进程

使用 SIGTERM 终止执行

顾名思义,这是一个终止程序的终止信号,但与 SIGKILL(无论如何都会终止程序)不同,这是一种要求程序终止的礼貌方式。

如果您想了解有关 SIGTERM 与 SIGKILL 的更多信息,我建议您阅读其他涉及核心基础的指南:

要记住的一件事是,有时它会在继续终止之前执行清理。

所以语法 SIGTERM 很简单:

kill -SIGTERM %jobID
使用 SIGTERM 终止后台进程

使用 SIGKILL(最后的手段)

⚠️始终建议使用 SIGKILL 作为最后的手段,因为它会立即杀死任何子进程,使其成为最残酷的杀死进程的方式!

偶尔,我发现自己处于某些程序根本无法运行并且根本无法终止的情况!

所以在这些情况下,我使用 SIGKILL 给那个过程带来最不愉快的死亡。

现在,让我们看一下 SIGKILL 的通用语法:

kill -SIGKILL %jobID
使用 SIGKILL 终止后台进程

总结

本指南是关于如何使用各种信号选项来终止执行的基本说明。 如果您仍有任何疑问,请在评论中告诉我。