鱒身(Masu_mi)のブログ

知った事をメモする場所。

GoでSignalをハンドリングする

signal.Notify を使ったのでメモ。

package main

import (
      "fmt"
      "os"
      "os/signal"
      "syscall"
      "time"
)

func init() {
      var sc = make(chan os.Signal)
      signal.Notify(sc, syscall.SIGABRT, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
      go func() {
              for {
                      s := <-sc
                      fmt.Printf("IGNORE: %s\n", s)
              }
      }()
}
func main() {
      p, _ := os.FindProcess(os.Getpid())
      for _, s := range []os.Signal{syscall.SIGABRT, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP} {
              fmt.Printf("Signal: %s\n", s)
              p.Signal(s)
              time.Sleep(1 * time.Second)
      }
}

以下の様に自分で投げるとSignalが投げられて到達する前にほかのSignalが到達してしまい前のが見えなくなる場合もある様子。

$ go version
[No write since last change]
go version go1.5.1 darwin/amd64
$ go run ./sig_sample.go
Signal: abort trap
Signal: interrupt
IGNORE: interrupt
Signal: terminated
IGNORE: terminated
Signal: hangup
IGNORE: hangup
$ go run ./sig_sample.go
Signal: abort trap
IGNORE: abort trap
Signal: interrupt
IGNORE: interrupt
Signal: terminated
IGNORE: terminated
Signal: hangup
IGNORE: hangup