sigterm信号_Golang之信号处理(Signal)
1、使用場景
實際項目中,我們希望修改了配置文件后,但又不想通過重啟進程讓它重新加載配置文件,可以使用signal的方式進行信號傳遞,或者我們希望通過信號控制,實現一種優雅的退出方式。Golang為我們提供了signal包,實現信號處理機制,允許Go 程序與傳入的信號進行交互。
2、常用的Term信號
3、簡單的栗子
package mainimport ("fmt""os""os/signal" )func main() {c := make(chan os.Signal)signal.Notify(c)fmt.Println("start..")s := <-cfmt.Println("End...", s) }(1)傳遞SIGINT信號
[homework@xxxxx signal]$ go run monitor.go start..#此時,CTL+C發送一個SIGINT信號量,得到輸出為: [homework@xxxxx signal]$ go run monitor.go start.. ^CEnd... interrupt(2)傳遞SIGTERM信號
打開2個Term窗口第一個運行go run monitor.go程序
第二個執行:ps -ef | grep monitor.go | grep grep -v | awk '{print $2}' | xargs kill #此時,kill命令發送一個SIGTERM信號量,得到輸出為: [homework@xxxxx signal]$ go run monitor.go start.. Terminated
4、優雅的退出守護進程
(1)何為優雅(graceful)?
Linux Server端的應用程序經常會長時間運行,在運行過程中,可能申請了很多系統資源,也可能保存了很多狀態。
在這些場景下,我們希望進程在退出前,可以釋放資源或將當前狀態dump到磁盤上或打印一些重要的日志,即希望進程優雅退出。
(2)從對優雅退出的理解不難看出:優雅退出可以通過捕獲SIGTERM來實現。
A、注冊SIGTERM信號的處理函數并在處理函數中做一些進程退出的準備,信號處理函數的注冊sigaction()來實現。
B、在主進程的main()中,通過類似于while(!fQuit)的邏輯來檢測那個flag變量,一旦fQuit在signal handler function中被置為true,則主進程退出while()循環,接下來就是一些釋放資源或dump進程當前狀態或記錄日志的動作,完成這些后,主進程退出。
栗子:優雅退出go守護進程
package mainimport ("fmt""os""os/signal""syscall""time" )func main() {//創建監聽退出chanc := make(chan os.Signal)//監聽指定信號 ctrl+c killsignal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)go func() {for s := range c {switch s {case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:fmt.Println("Program Exit...", s)GracefullExit()case syscall.SIGUSR1:fmt.Println("usr1 signal", s)case syscall.SIGUSR2:fmt.Println("usr2 signal", s)default:fmt.Println("other signal", s)}}}()fmt.Println("Program Start...")sum := 0for {sum++fmt.Println("sum:", sum)time.Sleep(time.Second)} }func GracefullExit() {fmt.Println("Start Exit...")fmt.Println("Execute Clean...")fmt.Println("End Exit...")os.Exit(0) }執行程序:
[homework@xxxx signal]$ go run monitor.go Program Start... sum: 1 sum: 2 sum: 3 sum: 4 sum: 5 sum: 6 ^CProgram Exit... interrupt Start Exit... Execute Clean... End Exit...5、信號的訂閱
信號的訂閱是通過 channel實現的,每個os.Signal channel 都會收聽自己相應的事件集。
關于Golang之信號處理的文章就寫到這里,Done!
總結
以上是生活随笔為你收集整理的sigterm信号_Golang之信号处理(Signal)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中mat函数_python
- 下一篇: python处理完数据导入数据库_pyt