1. 程式人生 > >golang訊號處理及一個簡單例子實現

golang訊號處理及一個簡單例子實現

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]來生成目錄:

多少人忙得連寫部落格的時間都沒有!