golang信号处理及一个简单例子实现

golang信号处理及一个例子实现

往往实际项目中,我们希望修改了配置文件后,但又不重启进程的情况下而让它重新加载配置文件,这时候就需要通过信号传递来进行处理这一优雅过程:

  • 最常用的几个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]来生成目录:

  • golang信号处理及一个例子实现
      • 几个Term终端传入信号
      • 操作说明
      • 一个简单的栗子实现


多少人忙得连写博客的时间都没有!

你可能感兴趣的:(技术类)