在 Go 语言中管控进程信号,非常简单。只需要简单的 3 行代码即可完成:
package main
import "os/signal"
func main() {
//信号接收 channel
sigCh := make(chan os.Signal, 1)
//监听信号(所有信号)
signal.Notify(sigCh)
//信号触发
sig := <-sigch
//TODO
}
为了更加方便在项目中集成,重新对以上功能代码进行一次简单的封装。如下:
package main
import (
"context"
"log"
"syscall"
"github.com/x-mod/sigtrap"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
capture := sigtrap.New(
sigtrap.Trap(syscall.SIGINT, sigtrap.Handler(cancel)),
sigtrap.Trap(syscall.SIGTERM, sigtrap.Handler(cancel)),
)
defer capture.Close()
log.Println("sigtrap: waiting ...")
log.Println("sigtrap:", capture.Serve(ctx))
}
可以直接参考项目源码: github.com/x-mod/sigtrap.