SIGTERM、SIGKILL、SIGINT,这些信号都是干嘛用的?¶
用过Linux的人,或多或少都碰到过Signal(信号),其中SIGTERM
、SIGKILL
、SIGINT
最为常见。本文做下总结。
SIGTERM¶
中文名一般叫“终止信号”,用于终止进程。
SIGTERM
最常见的一个应用场景是,执行命令 kill <PID>
,该命令会终止进程号为PID的进程。注意,这里kill
没有-9
之类的额外参数。
进程捕捉到SIGTERM
信号后,通常会做些善后工作然后退出,这个过程通常被叫做“优雅退出”。当然,进程也可以不做任何处理,忽略该信号,继续运行下去。信号可能被忽略了,这就是为啥有时候kill <PID>
根本不起作用。
除了kill
命令,SIGTERM
还有很多其他使用场景。比如,docker stop
、supervisorctl 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