Golang的 signal
在实际项目中我们可能有下面的需求:
1、修改了配置文件后,希望在不重启进程的情况下重新加载配置文件;
2、当用 Ctrl + C 强制关闭应用后,做一些必要的处理;
这时候就需要通过信号传递来进行处理了。golang中对信号的处理主要使用os/signal包中的两个方法:一个是notify方法用来监听收到的信号;一个是 stop方法用来取消监听。
监听信号
notify方法原型
func Notify(c chan<- os.Signal, sig ...os.Signal)
第一个参数表示接收信号的管道
第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。
下面是一个非常简单地例子:
package main
import (
"fmt"
"os"
"os/signal"
)
func main() {
c := make(chan os.Signal)
signal.Notify(c)
//signal.Notify(c, syscall.SIGHUP, syscall.SIGUSR2) //监听指定信号
s := <-c //阻塞直至有信号传入
fmt.Println("get signal:", s)
}
执行效果:
当按下 ctrl +c 键时:

上面的代码过于简单,一般我们会是用下面代码的方式来处理的。
package main
import (
"fmt"
"os"
"os/signal"
"time"
)
func main() {
go signalListen()
time.Sleep(time.Hour)
}
func signalListen() {
c := make(chan os.Signal)
signal.Notify(c)
for {
s := <-c
//收到信号后的处理,这里只是输出信号内容,可以做一些更有意思的事
fmt.Println("get signal:", s)
os.Exit(1)
}
}
执行效果:
这是在进入应用后, 按了四次回车,然后再按 Ctrl +C 的执行效果:

停止监听
package main
import (
"fmt"
"os"
"os/signal"
)
func main() {
c := make(chan os.Signal)
signal.Notify(c)
//当调用了该方法后,下面的for循环内<-c接收到一个信号就退出了。
signal.Stop(c)
for {
s := <-c
fmt.Println("get signal:", s)
}
}
执行效果:

golang中处理信号非常简单,但是关于信号本身需要了解的还有很多,建议可以参考《Unix高级编程》中的信号篇章。
参考资料:
golang信号signal的处理
http://www.01happy.com/golang-signal/
Go中的系统Signal处理
http://tonybai.com/2012/09/21/signal-handling-in-go/
Golang的 signal的更多相关文章
- golang处理signal
signal一般用来实现优雅重启,或者重新加载配置文件等操作. 废话不多说,上表格 动作 号码 信号 golang kill pid 15 SIGTERM terminated kill -9 pid ...
- Go的优雅终止姿势
最近优化了一版程序:用到了golang的优雅退出机制. 程序使用etcd的election sdk做高可用选主,需要在节点意外下线的时候,主动去etcd卸任(删除10s租约), 否则已经下线的节点还会 ...
- Golang -- Signal处理
我们在生产环境下运行的系统要求优雅退出,即程序接收退出通知后,会有机会先执行一段清理代码,将收尾工作做完后再真正退出.我们采用系统Signal来 通知系统退出,即kill pragram-pid.我们 ...
- golang语言中os/signal包的学习与使用
package main; import ( "os" "os/signal" "fmt" ) //signal包中提供了两个函数 //No ...
- golang 管道
2.管道简介Golang的原子并发特性使得它很容易构造流数据管道,这使得Golang可有效的使用I/O和多CPU特性.本文提出一些关于管道的示例,在这个过程中突出了操作失败的微妙之处和介绍处理失败的具 ...
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
目录 [TOC] 1.RabbitMQ介绍 1.1.什么是RabbitMQ? RabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol ...
- golang内存分配
golang内存分配 new一个对象的时候,入口函数是malloc.go中的newobject函数 func newobject(typ *_type) unsafe.Pointer { flags ...
- golang channel 用法转的
一.Golang并发基础理论 Golang在并发设计方面参考了C.A.R Hoare的CSP,即Communicating Sequential Processes并发模型理论.但就像John Gra ...
- 深入学习golang(2)—channel
Channel 1. 概述 “网络,并发”是Go语言的两大feature.Go语言号称“互联网的C语言”,与使用传统的C语言相比,写一个Server所使用的代码更少,也更简单.写一个Server除了网 ...
随机推荐
- 《快学Scala》第二章 控制结构和函数
- django实战-留言板
对应github链接:https://github.com/pshyms/django/tree/master/liuyanban 第一天 1. 创建一个新项目后,新建一个应用程序 python ma ...
- SpringCloud学习笔记(一)——基础
什么是微服务架构 简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进 ...
- Linux中的任务调度
1.crond,linux中的任务调度器 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入 ...
- OO第二单元の小结
第二单元(线程与电梯问题)总结博客 三次作业的设计策略 第一次:本次作业只有一部电梯,而且不用捎带.因此,我一共设计了两个线程:一个负责管理输入,一个负责电梯运行.同时,我将调度队列设置为单例模式,里 ...
- 初学struts2框架
昨天初学strts2,折腾了一晚上才正好一个简单的应用程序,在这个过程中遇到了很多的问题. 1. struts2的更新太快,所以从图书馆借的书常常会跟不上变化,所以有时执行起来会很麻烦. 2. 如果你 ...
- Ubuntu 16.04防火墙
防火墙(ufw) 说明:简单版本的防火墙,底层依赖于iptables. 安装:sudo apt-get install ufw 查看状态:sudo ufw status 开启/关闭:sudo ufw ...
- python常用工具
创建规范目录 import os BASE_PATH = os.path.dirname(__file__) li = ['bin', 'conf', 'core', 'db','interface ...
- How to install Jenkins on CentOS 7
How to install Jenkins on CentOS 7 on March 3, 2018 by AmirLeave a comment Introduction Jenkins is a ...
- Mac下像Windows那样带有预览图的快速切换-HyperSwitch
这东西是免费的,他家还出了一个HyperDock的收费软件. 下载:https://bahoom.com/hyperswitch/get 离线版本:(链接: https://pan.baidu.com ...