后台程序通常启动后就一直运行,如果需要停止通常使用
kill 进程号
发送信号方式处理,而不是直接kill -9 进程号
。所以就需要程序中正确接收信号并处理信号。
-
Golang中使用channel订阅信号
Golang提供的os库中包含Signal相关处理,通过channel方式订阅关心的信号,然后程序中读取channel处理信号。
-
常见的信号
使用kill 进程号
方式实际发送给进程SIGTERM信号,通常我们只需处理SIGTERM,SIGINT信号
-
一个处理信号并退出的例子
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值,从而退出循环,退出程序。