如何在 Linux 中使用 SIGINT 和其他终止信号
您一定习惯使用 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 命令并指定 PID 或 JOB ID -SIGTSTP
。
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
总结
本指南基本解释了如何使用各种信号选项来终止执行。如果您还有任何疑问,请在评论中告诉我。