signal.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package daemon
  2. import (
  3. "errors"
  4. "os"
  5. "os/signal"
  6. "syscall"
  7. )
  8. // ErrStop should be returned signal handler function
  9. // for termination of handling signals.
  10. var ErrStop = errors.New("stop serve signals")
  11. // SignalHandlerFunc is the interface for signal handler functions.
  12. type SignalHandlerFunc func(sig os.Signal) (err error)
  13. // SetSigHandler sets handler for the given signals.
  14. // SIGTERM has the default handler, he returns ErrStop.
  15. func SetSigHandler(handler SignalHandlerFunc, signals ...os.Signal) {
  16. for _, sig := range signals {
  17. handlers[sig] = handler
  18. }
  19. }
  20. // ServeSignals calls handlers for system signals.
  21. func ServeSignals() (err error) {
  22. signals := make([]os.Signal, 0, len(handlers))
  23. for sig := range handlers {
  24. signals = append(signals, sig)
  25. }
  26. ch := make(chan os.Signal, 8)
  27. signal.Notify(ch, signals...)
  28. for sig := range ch {
  29. err = handlers[sig](sig)
  30. if err != nil {
  31. break
  32. }
  33. }
  34. signal.Stop(ch)
  35. if err == ErrStop {
  36. err = nil
  37. }
  38. return
  39. }
  40. var handlers = make(map[os.Signal]SignalHandlerFunc)
  41. func init() {
  42. handlers[syscall.SIGTERM] = sigtermDefaultHandler
  43. }
  44. func sigtermDefaultHandler(sig os.Signal) error {
  45. return ErrStop
  46. }