go在linux捕捉退出信号,优雅退出任务
package main import ( "fmt" "os" "os/signal" "sync" "syscall" "time" ) func main() { c := make(chan os.Signal, 1) //创建一个接收信号量的管道 exitVar := false //定义一个变量来处理进程退出的问题 signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) //监听linux的信号 grp := sync.WaitGroup{} for i := 0; i < 10; i++ { grp.Add(1) go HandleData(i, &grp, &exitVar) //处理业务的方法 } //退出的时候,index变成false sig := <-c exitVar = true fmt.Println("task is exit", sig) grp.Wait() } func HandleData(num int, group *sync.WaitGroup, exit *bool) { for { if *exit { break } //这里可以放一些任务 fmt.Println("我是处理任务协程:", num) time.Sleep(1 * time.Second) } fmt.Println("收到退出信号处理退出逻辑") group.Done() }