Golang程序中如何监听并处理信号?
当运行一个终端程序或守护(daemon)进程时,经常需要响应来自用户或系统的信号来实现诸如:退出/重启/清理(clean up) 等工作,又或者利用信号通知机制实现一些业务功能,如:更新缓存、发送通知。。。
以下例子将会演示在 golang 中如何监听并处理信号:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
const FILENAME = "go-example.txt"
func main() {
SignalHandler()
CreateFile()
for {
fmt.Println("- Sleeping")
time.Sleep(10 * time.Second)
}
}
//监听并处理信号
func SignalHandler() {
c := make(chan os.Signal, 2)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c //阻塞等待
DeleteFile() //清理工作
os.Exit(0)
}()
}
//程序开始时创建一个文件,当退出程序时需要删除(clean up)该文件
func CreateFile() {
fmt.Println("- Create Out Example File")
file, _ := os.Create(FILENAME)
defer file.Close()
}
//清理工作:删除文件
func DeleteFile() {
fmt.Println("- Run Clean Up - Delete Our Example File")
_ = os.Remove(FILENAME)
fmt.Println("- Good bye!")
}
执行结果输出如下:
$ go run sigint.go
- Create Out Example File
- Sleeping
- Ctrl+C pressed in Terminal
- Run Clean Up - Delete Our Example File
- Good bye!
有疑问加站长微信联系(非本文作者)