如何在 Linux 中使用 SIGINT 和其他终止信号
终止正在执行的进程不仅仅是kill -9。以下是一些重要的终止信号及其用法。
您一定习惯使用 Ctrl + C 来终止任何进程,但您知道它会发送 SIGINT
信号吗?
但终止信号的类型远不止使用 SIGINT
(咳 Ctrl + c 咳)。那么,让我们深入了解终止信号的海洋吧!
在 Linux 中使用终止信号
Kill 命令是用户通常用来终止的命令,但是您知道 50 多个信号 Kill 命令对您有用吗?
这意味着您可以使用这些数字而不是编写信号名称。
例如,如果您想停止执行(挂起正在运行的进程),您最有可能使用 SIGTSTP
,如下所示:
kill -SIGTSTP %jobID
同样,您可以使用 20
,因为它与 SIGTSTP
关联,以达到相同的效果:
kill -20 %jobID
但选项太多,所以我将介绍广泛使用的选项。
那么让我们从 SIGSTP
开始。
使用 SIGTSTP 终止进程
首先,我先从杀掉前台进程说起。
与终止后台进程相比,它非常简单,因为您只需相应地使用键绑定即可。
执行SIGTSTP
的按键绑定是ctrl+z
。例如,我将使用 sleep 命令:
sleep 15000
在这里您可以看到我使用了 jobs 命令,这是一个有用的实用程序,可以显示正在运行和最近终止的进程。
但是后台进程呢?好吧,您需要使用kill 命令并通过-SIGTSTP
指定PID 或JOB ID。
kill -SIGSTP %jobID
使用 SIGCONT 恢复命令执行
有时您想要恢复最近终止的命令执行,在这种情况下,-SIGCONT
将为您提供帮助。
对于此示例,我将使用之前终止的进程,然后使用给定的命令恢复其执行:
kill -SIGCONT %jobID
使用 SIGINT 终止执行
这是我一直以来最喜欢的命令,因为每当我发现自己陷入困境时,ctrl+c
都会给我带来奇迹。
如果您不知道这一点,让我向您展示如何轻松终止命令执行:
但是 SIGINT
的问题是它可能在某些地方不起作用,例如 bash 解释器。
例如,下面是一个获取用户输入的 bash 脚本:
#!/bin/bash
trap date SIGINT
read input
echo User input: $input
echo Exiting now
正如您所看到的,当我按下 ctrl+c 时,它给了我当前的日期和时间,并且只有当它从我这边获得输入时才停止。
我知道这个脚本是这样创建的,但你说对了。您不能总是依赖 SIGINT
。
使用 SIGQUIT 终止
SIGQUIT 与 SIGINT 类似,但它也在执行前生成核心转储。
简单来说,核心转储是在系统崩溃或进程终止之前自动生成的文件。
另外,可以使用 ctrl+\
来激发它。因此您可以使用它来终止前台和后台进程。
因此,让我向您展示当您仅尝试 ctrl+\
时它的行为方式:
但如何使用它来终止后台进程呢?让我简单介绍一下语法部分,让它变得更容易:
kill -SIGQUIT %jobID
使用 SIGTERM 终止执行
顾名思义,这是一个终止程序的终止信号,但与 SIGKILL(无论如何都会终止程序)不同,这是一种请求终止程序的礼貌方式。
如果您想了解有关 SIGTERM 与 SIGKILL 的更多信息,我推荐其他涉及核心基础知识的指南:
要记住的一件事是,有时它会在继续终止之前执行清理操作。
所以 SIGTERM
的语法非常简单:
kill -SIGTERM %jobID
使用SIGKILL(最后的手段)
有时候,我发现自己遇到一些程序根本无法运行并且根本无法终止的情况!
因此,在这些情况下,我使用 SIGKILL
来让该进程以最不愉快的方式死亡。
现在,让我们看一下 SIGKILL 的通用语法:
kill -SIGKILL %jobID
包起来
本指南基本解释了如何使用各种信号选项来终止执行。如果您仍有任何疑问,请在评论中告诉我。