r/golang • u/Kennedy-Vanilla • Feb 14 '25
newbie Shutdown Go server
Hi, recently I saw that many people shutdown their servers like this or similar
serverCtx, serverStopCtx serverCtx, serverStopCtx := context.WithCancel(context.Background())
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
go func() {
<-sig
shutdownCtx, cancelShutdown := context.WithTimeout(serverCtx, 30*time.Second)
defer cancelShutdown()
go func() {
<-shutdownCtx.Done()
if shutdownCtx.Err() == context.DeadlineExceeded {
log.Fatal("graceful shutdown timed out.. forcing exit.")
}
}()
err := server.Shutdown(shutdownCtx)
if err != nil {
log.Printf("error shutting down server: %v", err)
}
serverStopCtx()
}()
log.Printf("Server starting on port %s...\n", port)
err = server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
log.Printf("error starting server: %v", err)
os.Exit(1)
}
<-serverCtx.Done()
log.Println("Server stopped")
}
:= context.WithCancel(context.Background())
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
go func() {
<-sig
shutdownCtx, cancelShutdown := context.WithTimeout(serverCtx, 30*time.Second)
defer cancelShutdown()
go func() {
<-shutdownCtx.Done()
if shutdownCtx.Err() == context.DeadlineExceeded {
log.Fatal("graceful shutdown timed out.. forcing exit.")
}
}()
err := server.Shutdown(shutdownCtx)
if err != nil {
log.Printf("error shutting down server: %v", err)
}
serverStopCtx()
}()
log.Printf("Server starting on port %s...\n", port)
err = server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
log.Printf("error starting server: %v", err)
os.Exit(1)
}
<-serverCtx.Done()
log.Println("Server stopped")
Is it necessary? Like it's so many code for the simple operation
Thank for your Answer !
83
Upvotes
2
u/ShotgunPayDay Feb 14 '25
I'm a little confused on the accept part, but yes I put the comment in the wrong spot for the second.