你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

Golang如何处理信号

2021/12/3 5:07:18

后台程序通常启动后就一直运行,如果需要停止通常使用kill 进程号发送信号方式处理,而不是直接kill -9 进程号。所以就需要程序中正确接收信号并处理信号。

  1. Golang中使用channel订阅信号

    Golang提供的os库中包含Signal相关处理,通过channel方式订阅关心的信号,然后程序中读取channel处理信号。
    信号流程

  2. 常见的信号
    使用kill 进程号方式实际发送给进程SIGTERM信号,通常我们只需处理SIGTERM,SIGINT信号
    常用信号

  3. 一个处理信号并退出的例子

    package main
    
    import (
    	"fmt"
    	"os"
    	"os/signal"
    	"syscall"
    )
    
    func main() {
    	c := make(chan os.Signal)
    	signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
    	exit := false
    	for !exit {
    		select {
    		case s := <- c:
    			if s == syscall.SIGINT {
    				fmt.Println("caught SIGINT")
    				exit = true
    			} else if s == syscall.SIGTERM {
    				fmt.Println("caught SIGTERM")
    				exit = true
    			} else {
    				fmt.Println("caught unexpect signal: ", s)
    			}
    		}
    	}
    }
    

    首先定义os.Signal类型的channel,并注册关心的信号syscall.SIGINT,syscall.SIGTERM。然后我们程序就在后台运行,执行for循环;当接收到SIGINT或SIGTERM信号时,我们改变exit值,从而退出循环,退出程序。