1、使用场景

实际项目中,我们希望修改了配置文件后,但又不想通过重启进程让它重新加载配置文件,可以使用signal的方式进行信号传递,或者我们希望通过信号控制,实现一种优雅的退出方式。Golang为我们提供了signal包,实现信号处理机制,允许Go 程序与传入的信号进行交互。

2、常用的Term信号

3、简单的栗子

package mainimport ("fmt""os""os/signal"
)func main() {c := make(chan os.Signal)signal.Notify(c)fmt.Println("start..")s := <-cfmt.Println("End...", s)
}

(1)传递SIGINT信号

[homework@xxxxx signal]$ go run monitor.go
start..#此时,CTL+C发送一个SIGINT信号量,得到输出为:
[homework@xxxxx signal]$ go run monitor.go
start..
^CEnd... interrupt

(2)传递SIGTERM信号

打开2个Term窗口
第一个运行go run monitor.go程序
第二个执行:ps -ef | grep monitor.go | grep grep -v | awk '{print $2}' | xargs kill

#此时,kill命令发送一个SIGTERM信号量,得到输出为:
[homework@xxxxx signal]$ go run monitor.go
start..
Terminated

4、优雅的退出守护进程

(1)何为优雅(graceful)?

Linux Server端的应用程序经常会长时间运行,在运行过程中,可能申请了很多系统资源,也可能保存了很多状态。

在这些场景下,我们希望进程在退出前,可以释放资源或将当前状态dump到磁盘上或打印一些重要的日志,即希望进程优雅退出。

(2)从对优雅退出的理解不难看出:优雅退出可以通过捕获SIGTERM来实现。

A、注册SIGTERM信号的处理函数并在处理函数中做一些进程退出的准备,信号处理函数的注册sigaction()来实现。

B、在主进程的main()中,通过类似于while(!fQuit)的逻辑来检测那个flag变量,一旦fQuit在signal handler function中被置为true,则主进程退出while()循环,接下来就是一些释放资源或dump进程当前状态或记录日志的动作,完成这些后,主进程退出。

栗子:优雅退出go守护进程

package mainimport ("fmt""os""os/signal""syscall""time"
)func main() {//创建监听退出chanc := make(chan os.Signal)//监听指定信号 ctrl+c killsignal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)go func() {for s := range c {switch s {case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:fmt.Println("Program Exit...", s)GracefullExit()case syscall.SIGUSR1:fmt.Println("usr1 signal", s)case syscall.SIGUSR2:fmt.Println("usr2 signal", s)default:fmt.Println("other signal", s)}}}()fmt.Println("Program Start...")sum := 0for {sum++fmt.Println("sum:", sum)time.Sleep(time.Second)}
}func GracefullExit() {fmt.Println("Start Exit...")fmt.Println("Execute Clean...")fmt.Println("End Exit...")os.Exit(0)
}

执行程序:

[homework@xxxx signal]$ go run monitor.go
Program Start...
sum: 1
sum: 2
sum: 3
sum: 4
sum: 5
sum: 6
^CProgram Exit... interrupt
Start Exit...
Execute Clean...
End Exit...

5、信号的订阅

信号的订阅是通过 channel实现的,每个os.Signal channel 都会收听自己相应的事件集。

关于Golang之信号处理的文章就写到这里,Done!

sigterm信号_Golang之信号处理(Signal)相关推荐

  1. 「信号机制」Python信号处理—signal模块

    转载请注明出处:https://blog.csdn.net/jinixin/article/details/80383177 本文是信号机制三篇记录中的第二篇,介绍Python语言中负责信号处理的si ...

  2. Python学习-Scipy库信号处理signal(过滤、快速傅里叶变换、信号窗函数、卷积)

    Python学习-Scipy库信号处理signal 目录 1.过滤:以某种方式修改输入信号 2.快速傅里叶变换 3.信号窗函数 4.卷积 导入库 import matplotlib.pyplot as ...

  3. 【B站视频笔记】linux 进程间通信(ipc)信号(软中断信号)signal库函数、可靠信号和不可靠信号、信号集sigprocmask(信号掩码、信号递达Delivery、信号未决Pending)

    [视频教程]Linux信号详解(可靠信号.不可靠信号.阻塞信号.信号处理函数) [博文]Linux信号 文章目录 背景 课程笔记 一.如何让程序在后台运行 1.加"&"符号 ...

  4. C/C++ 信号处理 Signal

    信号 signal 可以理解为由操作系统传给程序(进程)的事件,只是用来通知程序发生了什么事件,并不会传递给该进程任何数据. 信号是一种中断,因为它可以改变程序的流程.当信号传递给进程时,进程将停下其 ...

  5. 教程:16、信号机制与信号处理

    信号(signal)是Linux进程间通信的一种机制,全称为软中断信号,也被称为软中断.信号本质上是在软件层次上对硬件中断机制的一种模拟. 与其他进程间通信方式(例如管道.共享内存等)相比,信号所能传 ...

  6. linux任务处理函数,Linux信号掩码和信号处理函数

    1.信号掩码--被阻塞的信号集 每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞.当前被进程阻塞的信号集也叫信号掩码,类 ...

  7. 刨根问底:linux中bash shell中SIGHUP和SIGTERM信号的处理

    新人最容易发生的事情就是用ssh客户端(比如xshell)登录服务器之后,用&在后台执行了命令,第二天兴致勃勃去看任务,发现已经被kill了.一开始我学到的知识是,运行的后台命令都需要nohu ...

  8. 信号的用法,signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  9. Linux信号详解:signal与sigaction函数【2】

    我们已经讨论了Linux操作系统中"信号"."中断"."僵尸进程"'等重要概念.结合C语言中的setjmp.longjump.sigsetj ...

最新文章

  1. YOLOv5在最新OpenVINO 2021R02版本的部署与代码演示详解
  2. windows默认共享的打开和关闭?
  3. [物理学与PDEs]第3章习题1 只有一个非零分量的磁场
  4. [算法题] Add Two Numbers
  5. STM32开发 -- 低功耗模式详解(2)
  6. Django 笔记5 -- 数据库
  7. NC88-寻找第K大的数
  8. Mysql 索引-1
  9. nand ubi -4 kernel和mtd
  10. FTP客户端的基本使用---Linux学习笔记
  11. Eclipse项目左上角出现大红色感叹号怎么办?
  12. php智能裁剪黑边,图片裁剪去除黑边
  13. 新计算机 安装win2000,图文教程!Windows 2000安装过程全接触
  14. web:网站性能工具Yslow
  15. session 分布式处理-----https://segmentfault.com/a/1190000013447750?utm_source=tag-newest
  16. 可以替代basemap的几个工具
  17. 学习webpack系列之一 ---- (手动部署环境)
  18. 背离意味着趋势正在减弱
  19. APP调用微信授权登录-JAVA后台实现
  20. 理工男博士买房记:按照科学原理去爱,没哪个妹子能招架得了

热门文章

  1. hyperf自定义注解类_swoole学习六hyperf注解的使用
  2. Winedit 快捷键概览
  3. 微软亚洲研究院发布“人立方关系搜索”
  4. [总结] 网络流最大流算法反向边的作用
  5. Visual BERT论文的简单汇总
  6. 计算机视觉 - 知识点总结(面试、笔试)
  7. html 桌面截图,如何使用javascript在html中截取屏幕截图?
  8. media player怎么不能拖进度图mp4_榜样力量丨科研路上有难题,学长教你怎么解
  9. mysql text blob_mysql的text/blob和行溢出
  10. 20220312 矩阵许瓦茨不等式