golang訊號處理及一個簡單例子實現
阿新 • • 發佈:2019-02-02
golang訊號處理及一個例子實現
往往實際專案中,我們希望修改了配置檔案後,但又不重啟程序的情況下而讓它重新載入配置檔案,這時候就需要通過訊號傳遞來進行處理這一優雅過程:
- 最常用的幾個Term終端傳入訊號
- 操作說明
- 一個簡單的栗子實現
幾個Term終端傳入訊號
最常用的幾個Term終端傳入訊號和引數值及說明:
訊號 | 值 | 說明 |
---|---|---|
SIGHUP | 1 | 終端控制程序結束(終端連線斷開) |
SIGINT | 2 | 使用者傳送INTR字元(Ctrl+C)觸發 |
SIGQUIT | 3 | 使用者傳送QUIT字元(Ctrl+/)觸發 |
SIGKILL | 9 | 無條件結束程式(不能被捕獲、阻塞或忽略) |
SIGUSR1 | 10 | 使用者保留 |
SIGUSR2 | 12 | 使用者保留 |
SIGPIPE | 13 | 訊息管道損壞(FIFO/Socket通訊時,管道未開啟而進行寫操作) |
SIGALRM | 14 | 時鐘定時訊號 |
SIGTERM | 15 | 結束程式(可以被捕獲、阻塞或忽略) |
操作說明
監聽,例如:
package main
import (
"fmt"
"os"
"os/signal" // 監聽全部訊號
)
func main() { //合建chan
c := make(chan os.Signal) //監聽所有訊號
signal.Notify(c) //阻塞直到有訊號傳入
fmt.Println("啟動")
s := <-c
fmt.Println("退出訊號", s)
}
執行命令,譬如:
視窗1
liwan2017@ubuntu:~/gopath/src/sign$ go run sign1.go
啟動
退出訊號 user defined signal 1
liwan2017@ubuntu:~/gopath/src/sign$
視窗2
liwan2017@ubuntu:~/gopath/src/sign$ ps -ef |grep sign1
liwan20+ 4976 4940 0 20:23 pts/27 00:00:00 go run sign1.go
liwan20+ 4996 4976 0 20:23 pts/27 00:00:00 /tmp/go-build894224314/command-line-arguments/_obj/exe/sign1
liwan20+ 5009 4959 0 20:27 pts/28 00:00:00 grep --color=auto sign1
liwan2017@ubuntu:~/gopath/src/sign$
liwan2017@ubuntu:~/gopath/src/sign$ kill -10 4996
liwan2017@ubuntu:~/gopath/src/sign$
一個簡單的栗子實現
package main
import (
"fmt"
"os"
"os/signal" // 監聽全部訊號
)
func main() { //建立監聽退出chan
for {
c := make(chan os.Signal) //監聽指定訊號 ctrl+c kill
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGUSR1, syscall.SIGUSR2)
s := <-c
switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
fmt.Pintln("exit", s)
case syscall.SIGUSR1: //kill -10 pid
//SetLogLevel("DEBUG") //切換日誌級別DEBUG
fmt.Pintln("usr1", s)
case syscall.SIGUSR2: //kill -12 pid
//SetLogLevel("ERROR") //切換日誌級別ERROR
fmt.Pintln("usr2", s)
default:
Debug("other", s)
}
}
}
用 [TOC]
來生成目錄:
多少人忙得連寫部落格的時間都沒有!