func waitOnErrOrSignal(c *config.Config, logger *steno.Logger, errChan <-chan error, router *router.Router) { signals := make(chan os.Signal, 1) signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT, syscall.SIGUSR1) select { case err := <-errChan: if err != nil { logger.Errorf("Error occurred: %s", err.Error()) os.Exit(1) } case sig := <-signals: go func() { for sig := range signals { logger.Infod( map[string]interface{}{ "signal": sig.String(), }, "gorouter.signal.ignored", ) } }() if sig == syscall.SIGUSR1 { logger.Infod( map[string]interface{}{ "timeout": (c.DrainTimeout).String(), }, "gorouter.draining", ) router.Drain(c.DrainTimeout) } stoppingAt := time.Now() logger.Info("gorouter.stopping") router.Stop() logger.Infod( map[string]interface{}{ "took": time.Since(stoppingAt).String(), }, "gorouter.stopped", ) } }