Unix Signal Handling

Go 에서 Unix signal 을 처리하기 위해선 os/signal package 를 사용해야 한다.

The signals SIGKILL and SIGSTOP may not be caught by a program, and therefore cannot be affected by this package.

Signals:

  • SIGTERM 을 받았을 때 적절하게 서버를 종료하는 경우
  • 커맨드라인 도구에서 SIGINT 를 받았을 때 프로세스를 멈추는 경우

Examples by Mochi MQTT:

func main() {
  // Create signals channel to run server until interrupted
  sigs := make(chan os.Signal, 1)
  done := make(chan bool, 1)
  signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
  go func() {
    <-sigs
    done <- true
  }()

  // Create the new MQTT Server.
  server := mqtt.New(nil)
  
  // Allow all connections.
  _ = server.AddHook(new(auth.AllowHook), nil)
  
  // Create a TCP listener on a standard port.
  tcp := listeners.NewTCP("t1", ":1883", nil)
  err := server.AddListener(tcp)
  if err != nil {
    log.Fatal(err)
  }
  

  go func() {
    err := server.Serve()
    if err != nil {
      log.Fatal(err)
    }
  }()

  // Run server until interrupted
  <-done

  // Cleanup
}