Golang 截获Ctrl+C以及Kill指令并执行清除工作
问题背景
有时候我们需要在程序退出前执行清理工作,比如把内存Cache里的数据写入数据库等。这时候,就需要能够截获Ctrl+C指令或者kill指令。
解决方法
// 执行清理工作
func cleanUp() {
logs.Info("do cleaning up ...")
storage.Flush()
logs.Info("===== clean up done =====")
}
// 监听退出指令
func watch() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL) // 其中 SIGKILL = kill -9 <pid> 可能无法截获
go func() {
log.Info("watching stop signals")
<-c
logs.Info("got SIGTERM signal, try clean up ...")
cleanUp()
logs.Info("===== ready to exit on SIGTERM =====")
os.Exit(1)
}()
}
func main() {
watch()
// 启动 APP
beego.Run()
}
注意事项
使用*kill -9 *指令时,进程将直接退出,这时候通常是截获不到的。