shutdown - Simple go signals handler for performing graceful shutdown by executing callback function
Contributors:
Want to contribute ? Feel free to send pull requests!
Have problems, bugs, feature ideas? We are using the github issue tracker to manage them.
For examples visit godoc#pkg-examples
For GoDoc reference, visit pkg.go.dev
For detailed breakdown of example How to handle signals with Go to graceful shutdown HTTP server
package main
import (
"context"
"fmt"
"log"
"net"
"net/http"
"os"
"syscall"
"time"
"github.com/vardius/shutdown"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Hello!")
})
httpServer := &http.Server{
Addr: ":8080",
Handler: mux,
BaseContext: func(_ net.Listener) context.Context { return ctx },
}
stop := func() {
gracefulCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := httpServer.Shutdown(gracefulCtx); err != nil {
log.Printf("shutdown error: %v\n", err)
} else {
log.Printf("gracefully stopped\n")
}
}
// Run server
go func() {
if err := httpServer.ListenAndServe(); err != http.ErrServerClosed {
log.Printf("HTTP server ListenAndServe: %v", err)
os.Exit(1)
}
}()
shutdown.GracefulStop(stop) // will block until shutdown signal is received
}
📜 License
This package is released under the MIT license. See the complete license in the package