package signals import ( "os" "os/signal" "sync" "syscall" ) var ( signalHandlers []func() signalHandlersMutex sync.Mutex signalHandlersOnce sync.Once ) func RegisterGracefulTerminationHandler(fn func()) { signalHandlersMutex.Lock() defer signalHandlersMutex.Unlock() signalHandlers = append(signalHandlers, fn) } func init() { signalHandlersOnce.Do(func() { c := make(chan os.Signal, 1) signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) go signalHandler(c) }) } func signalHandler(c chan os.Signal) { <-c signalHandlersMutex.Lock() defer signalHandlersMutex.Unlock() for _, fn := range signalHandlers { fn() } os.Exit(0) }