你应该使用过 ctrl + c 来终止进程,但是你知道它会发送 SIGINT 信号吗?
除了发送 SIGINT 信号(ctrl +c)以外,还有很多其他的终止信号,今天我们就来介绍下终止信号。
在 Linux 中使用终止信号
我们通常使用 kill 命令来终止进程,kill 命令可用的信号超过 50 个:
使用 kill 命令可以使用这些信号代码来代替信号名称。比如,如果我们想要停止执行某个进程,那么可以使用 SIGTSTP,如下所示:
kill -SIGTSTP %jobIDkill -SIGTSTP %jobIDkill -SIGTSTP %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[1]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-2.png)
以上是使用信号名称(SIGTSTP),另外也可以使用它对应的代码 20,结果是相同的,如下:
kill -20 %jobIDkill -20 %jobIDkill -20 %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[2]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-3.png)
下面我们介绍一些常用的信号,首先看一下 SIGSTP。
使用 SIGSTP 终止进程
首先我们从前台进程开始。与终止后台进程相比,终止前台进程更加简单,只需要使用绑定的快捷键即可。
执行 SIGTSTP 的快捷键是 ctrl +z。比如,作为演示,我们使用 sleep 命令:
sleep 15000sleep 15000sleep 15000
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[3]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-4.png)
上面的例子中,我们使用了 jobs 命令,这是一个很有用的工具,可以显示正在运行和最近终止的进程。
那么,如何终止后台进程呢?需要使用 kill 命令,使用 SIGTSTP 指定 PID 或者 JOBID,如下所示:
kill -SIGSTP %jobIDkill -SIGSTP %jobIDkill -SIGSTP %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[4]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-5.png)
使用 SIGCONT 恢复命令执行
SIGCONT 可以帮助恢复最近终止执行的命令。如下所示:
kill -SIGCONT %jobIDkill -SIGCONT %jobIDkill -SIGCONT %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[5]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-6.png)
使用 SIGINT 终止执行
这是我使用最多的用于终止的命令。我们举个例子,如下:
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[6]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-7.png)
但 SIGINT 也不是万能的,它在某些地方不起作用,比如 bash 解释器中。比如,下面这个 bash 脚本用于接受用户输入:
#!/bin/bashtrap date SIGINTread inputecho User input: $inputecho Exiting now#!/bin/bashtrap date SIGINTread inputecho User input: $inputecho Exiting now#!/bin/bashtrap date SIGINTread inputecho User input: $inputecho Exiting now
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[7]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-8.png)
如上图所示,当我按下 ctrl + c 时,它显示当前的日期和时间,只有当我输入了某些信息时,它才停止。
使用 SIGQUIT 终止
SIGQUIT 类似于 SIGINT,但它也会在执行前生成一个核心转储(core dump)。
简单地说,核心转储是在系统崩溃或进程终止之前自动生成的文件。
它可以通过快捷键 ctrl + \ 来触发,可以用来终止前台进程和后台进程。
看下面的例子:
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[8]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-9.png)
上述例子是终止一个前台进程,那么怎样用它来终止后台进程呢?看如下语法:
kill -SIGQUIT %jobIDkill -SIGQUIT %jobIDkill -SIGQUIT %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[9]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-10.png)
使用 SIGTERM 终止执行
顾名思义,这是一个终止程序的终止信号,但与 SIGKILL(不管怎样都会终止程序)不同,这是要求终止程序相对柔和的方式。
有时它会在终止前进行清理,其语法如下所示:
kill -SIGTERM %jobIDkill -SIGTERM %jobIDkill -SIGTERM %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[10]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-11.png)
使用 SIGKILL
SIGKILL 可以即时强制杀掉任何子进程。有时候,我们可能会遇到这样的问题:有些程序根本无法运行,而且根本无法终止!
这种情况下,我们就可以使用 SIGKILL 来强制杀掉进程。其使用语法如下所示:
kill -SIGKILL %jobIDkill -SIGKILL %jobIDkill -SIGKILL %jobID
![Linux终止或杀死进程命令,两种办法可以搞定! 图片[11]-Linux终止或杀死进程命令,两种办法可以搞定!-不念博客](https://www.bunian.cn/wp-content/uploads/2023/03/image-12.png)