// executeShutdownCallbacks executes the shutdown callbacks as initiated // by signame. It logs any errors and returns the recommended exit status. // This function is idempotent; subsequent invocations always return 0. func executeShutdownCallbacks(signame string) (exitCode int) { shutdownCallbacksOnce.Do(func() { serversMu.Lock() errs := server.ShutdownCallbacks(servers) serversMu.Unlock() if len(errs) > 0 { for _, err := range errs { log.Printf("[ERROR] %s shutdown: %v", signame, err) } exitCode = 1 } }) return }
func init() { // Trap quit signals (cross-platform) go func() { shutdown := make(chan os.Signal, 1) signal.Notify(shutdown, os.Interrupt, os.Kill) <-shutdown var exitCode int serversMu.Lock() errs := server.ShutdownCallbacks(servers) serversMu.Unlock() if len(errs) > 0 { for _, err := range errs { log.Printf("[ERROR] Shutting down: %v", err) } exitCode = 1 } os.Exit(exitCode) }() }