Go服务优雅退出
程序员文章站
2022-04-22 21:54:44
...
golang signal.Notify 信号,如何优雅的退出
参考:https://www.cnblogs.com/landv/p/13139127.html
golang 中的signal 包的Notify函数:func Notify(c chan<- os.Signal, sig ...os.Signal)
Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c;否则只传递列出的输入信号。
signal包不会为了向c发送信息而阻塞(就是说如果发送时c阻塞了,signal包会直接放弃):调用者应该保证c有足够的缓存空间可以跟上期望的信号频率。对使用单一信号用于通知的通道,缓存为1就足够了。
优雅退出go守护进程
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
//创建监听退出chan
c := make(chan os.Signal)
//监听指定信号 ctrl+c kill
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM,
syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)
go func() {
for s := range c {
switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
fmt.Println("Program Exit...", s)
GracefullExit()
case syscall.SIGUSR1:
fmt.Println("usr1 signal", s)
case syscall.SIGUSR2:
fmt.Println("usr2 signal", s)
default:
fmt.Println("other signal", s)
}
}
}()
fmt.Println("Program Start...")
sum := 0
for {
sum++
fmt.Println("sum:", sum)
time.Sleep(time.Second)
}
}
func GracefullExit() {
fmt.Println("Start Exit...")
fmt.Println("Execute Clean...")
fmt.Println("End Exit...")
os.Exit(0)
}
上一篇: netty应用退出