KyleBlog.cn 文章 标签 关于
文章 标签 关于

SIGTERM、SIGKILL、SIGINT,这些信号都是干嘛用的?

用过Linux的人,或多或少都碰到过Signal(信号),其中SIGTERMSIGKILLSIGINT最为常见。本文做下总结。

SIGTERM

中文名一般叫“终止信号”,用于终止进程。

SIGTERM最常见的一个应用场景是,执行命令 kill <PID>,该命令会终止进程号为PID的进程。注意,这里kill没有-9之类的额外参数。

进程捕捉到SIGTERM信号后,通常会做些善后工作然后退出,这个过程通常被叫做“优雅退出”。当然,进程也可以不做任何处理,忽略该信号,继续运行下去。信号可能被忽略了,这就是为啥有时候kill <PID>根本不起作用。

除了kill命令,SIGTERM还有很多其他使用场景。比如,docker stopsupervisorctl stop背后的实现机制就是给进程发送SIGTERM信号。

本站有篇文章,就是讲进程如何处理SIGTERM信号从而实现优雅退出的,具体请参考 使apscheduler的docker容器支持优雅退出

SIGKILL

SIGKILL,名字明显比SIGTERM霸气,字面意思就是“杀死”进程。最常见的应用场景就是大名鼎鼎的kill -9 <PID>命令。

SIGKILL最大的特点是,被杀的进程根本无法捕获处理该信号,操作系统会负责直接杀掉进程,进程没有任何反抗的余地。这个大杀器效果立竿见影,但是也有副作用,就是经常来不及做任何善后工作,可能引起数据丢失等问题。比如说,一个进程可能会把接收到的数据先临时放到内存里,攒到若干MB后再一次性写入磁盘,从而避免频繁的磁盘IO操作(比如迅雷就是这么干的),如果进程被突然杀掉,那么它根本来不及把内存里的数据写入磁盘,进而导致这些数据丢失。

SIGINT

SIGINT的字面意思是“打断”,和SIGTERM类似,区别在于,该信号通常被用于前台进程(可以简单理解为可以在shell上长期存在,不会后台运行的程序)。

当我们使用命令行程序时,按下CTRL + C时,进程便会收到SIGINT信号。一般进程会捕获处理这个命令并退出。当然,跟处理SIGTERM信号一样,进程也可以选择忽略信号并继续运行。

本文为kyleblog.cn原创,转载请注明出处:https://www.kyleblog.cn/posts/signal

发布日期:2022-08-15 联系作者