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 *指令时,进程将直接退出,这时候通常是截获不到的。

参考