DEV Community

Clavin June
Clavin June

Posted on • Originally published at clavinjune.dev on

Golang HTTP Server Graceful Shutdown

Sunday Snippet #6 golang HTTP server graceful shutdown

package main import ( "context" "errors" "log" "net/http" "os" "os/signal" "syscall" "time" ) func createChannel() (chan os.Signal, func()) { stopCh := make(chan os.Signal, 1) signal.Notify(stopCh, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) return stopCh, func() { close(stopCh) } } func start(server *http.Server) { log.Println("application started") if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { panic(err) } else { log.Println("application stopped gracefully") } } func shutdown(ctx context.Context, server *http.Server) { ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() if err := server.Shutdown(ctx); err != nil { panic(err) } else { log.Println("application shutdowned") } } func main() { log.SetFlags(log.Lshortfile) s := &http.Server{} go start(s) stopCh, closeCh := createChannel() defer closeCh() log.Println("notified:", <-stopCh) shutdown(context.Background(), s) } 
Enter fullscreen mode Exit fullscreen mode

runtime:

$ go run main.go main.go:24: application started ^Cmain.go:50: notified: interrupt # ctrl+c main.go:28: application stopped gracefully main.go:39: application shutdowned $ 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)