Golang程式中如何監聽並處理訊號?
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!