sigterm信号_Golang之信号处理(Signal)
1、使用場景
實際項目中,我們希望修改了配置文件后,但又不想通過重啟進程讓它重新加載配置文件,可以使用signal的方式進行信號傳遞,或者我們希望通過信號控制,實現(xiàn)一種優(yōu)雅的退出方式。Golang為我們提供了signal包,實現(xiàn)信號處理機制,允許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發(fā)送一個SIGINT信號量,得到輸出為: [homework@xxxxx signal]$ go run monitor.go start.. ^CEnd... interrupt(2)傳遞SIGTERM信號
打開2個Term窗口第一個運行g(shù)o run monitor.go程序
第二個執(zhí)行:ps -ef | grep monitor.go | grep grep -v | awk '{print $2}' | xargs kill #此時,kill命令發(fā)送一個SIGTERM信號量,得到輸出為: [homework@xxxxx signal]$ go run monitor.go start.. Terminated
4、優(yōu)雅的退出守護進程
(1)何為優(yōu)雅(graceful)?
Linux Server端的應(yīng)用程序經(jīng)常會長時間運行,在運行過程中,可能申請了很多系統(tǒng)資源,也可能保存了很多狀態(tài)。
在這些場景下,我們希望進程在退出前,可以釋放資源或?qū)?dāng)前狀態(tài)dump到磁盤上或打印一些重要的日志,即希望進程優(yōu)雅退出。
(2)從對優(yōu)雅退出的理解不難看出:優(yōu)雅退出可以通過捕獲SIGTERM來實現(xiàn)。
A、注冊SIGTERM信號的處理函數(shù)并在處理函數(shù)中做一些進程退出的準(zhǔn)備,信號處理函數(shù)的注冊sigaction()來實現(xiàn)。
B、在主進程的main()中,通過類似于while(!fQuit)的邏輯來檢測那個flag變量,一旦fQuit在signal handler function中被置為true,則主進程退出while()循環(huán),接下來就是一些釋放資源或dump進程當(dāng)前狀態(tài)或記錄日志的動作,完成這些后,主進程退出。
栗子:優(yōu)雅退出go守護進程
package mainimport ("fmt""os""os/signal""syscall""time" )func main() {//創(chuàng)建監(jiān)聽退出chanc := make(chan os.Signal)//監(jiān)聽指定信號 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) }執(zhí)行程序:
[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實現(xiàn)的,每個os.Signal channel 都會收聽自己相應(yīng)的事件集。
關(guān)于Golang之信號處理的文章就寫到這里,Done!
總結(jié)
以上是生活随笔為你收集整理的sigterm信号_Golang之信号处理(Signal)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中mat函数_python
- 下一篇: python处理完数据导入数据库_pyt