How to Implement Graceful Shutdown with Context in Go

Implement graceful shutdown in Go by using context cancellation triggered by OS signals like SIGINT and SIGTERM.

Implement graceful shutdown by creating a context that cancels on OS signals and passing it to your goroutines.

package main

import (
	"context"
	"log"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	go func() {
		<-ctx.Done()
		log.Println("Shutting down...")
	}()

	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)

	select {
	case <-sigChan:
		log.Println("Received interrupt signal")
		cancel()
	case <-time.After(5 * time.Second):
		log.Println("Timeout")
	}
}