往往实际项目中,我们希望修改了配置文件后,但又不重启进程的情况下而让它重新加载配置文件,这时候就需要通过信号传递来进行处理这一优雅过程:
- 最常用的几个Term终端传入信号
- 操作说明
- 一个简单的栗子实现
几个Term终端传入信号
最常用的几个Term终端传入信号和参数值及说明:
信号 | 值 | 说明 |
---|---|---|
SIGHUP | 1 | 终端控制进程结束(终端连接断开) |
SIGINT | 2 | 用户发送INTR字符(Ctrl+C)触发 |
SIGQUIT | 3 | 用户发送QUIT字符(Ctrl+/)触发 |
SIGKILL | 9 | 无条件结束程序(不能被捕获、阻塞或忽略) |
SIGUSR1 | 10 | 用户保留 |
SIGUSR2 | 12 | 用户保留 |
SIGPIPE | 13 | 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作) |
SIGALRM | 14 | 时钟定时信号 |
SIGTERM | 15 | 结束程序(可以被捕获、阻塞或忽略) |
操作说明
监听,例如:
package main
import (
"fmt"
"os"
"os/signal" // 监听全部信号
)
func main() { //合建chan
c := make(chan os.Signal) //监听所有信号
signal.Notify(c) //阻塞直到有信号传入
fmt.Println("启动")
s := <-c
fmt.Println("退出信号", s)
}
执行命令,譬如:
窗口1
liwan2017@ubuntu:~/gopath/src/sign$ go run sign1.go
启动
退出信号 user defined signal 1
liwan2017@ubuntu:~/gopath/src/sign$
窗口2
liwan2017@ubuntu:~/gopath/src/sign$ ps -ef |grep sign1
liwan20+ 4976 4940 0 20:23 pts/27 00:00:00 go run sign1.go
liwan20+ 4996 4976 0 20:23 pts/27 00:00:00 /tmp/go-build894224314/command-line-arguments/_obj/exe/sign1
liwan20+ 5009 4959 0 20:27 pts/28 00:00:00 grep --color=auto sign1
liwan2017@ubuntu:~/gopath/src/sign$
liwan2017@ubuntu:~/gopath/src/sign$ kill -10 4996
liwan2017@ubuntu:~/gopath/src/sign$
一个简单的栗子实现
package main
import (
"fmt"
"os"
"os/signal" // 监听全部信号
)
func main() { //创建监听退出chan
for {
c := make(chan os.Signal) //监听指定信号 ctrl+c kill
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)
s := <-c
switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
fmt.Pintln("exit", s)
case syscall.SIGUSR1: //kill -10 pid
//SetLogLevel("DEBUG") //切换日志级别DEBUG
fmt.Pintln("usr1", s)
case syscall.SIGUSR2: //kill -12 pid
//SetLogLevel("ERROR") //切换日志级别ERROR
fmt.Pintln("usr2", s)
default:
Debug("other", s)
}
}
}
[TOC]
多少人忙得连写博客的时间都没有!