From 81e1aea8c9995e416853e8a940728bdf10eb5208 Mon Sep 17 00:00:00 2001 From: joelei Date: Fri, 26 Dec 2025 18:03:38 +0800 Subject: [PATCH] feat: add root ctx cancel --- cli/cli.go | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/cli/cli.go b/cli/cli.go index e4a1a9b..fb1cb5d 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -5,6 +5,7 @@ import ( "context" "errors" "fmt" + "log/slog" "os" "os/signal" "syscall" @@ -15,10 +16,8 @@ import ( ) var ( - // SignalChan ... - SignalChan = make(chan os.Signal, 1) - // ErrSignal ... - ErrSignal = errors.New("signal") + // errSignal ... + errSignal = errors.New("signal") ) // Run provides the common boilerplate code around executing a cobra command. @@ -42,17 +41,28 @@ func Run(cmd *cobra.Command) int { } func execute(cmd *cobra.Command) error { - ctx := context.Background() + ctx, cancel := context.WithCancelCause(context.Background()) + // graceful shutdown signal - signal.Notify(SignalChan, syscall.SIGINT, syscall.SIGTERM) + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) + go func() { + select { + case s := <-signalChan: + slog.WarnContext(ctx, "Signal received", "signal", s) + cancel(fmt.Errorf("%w %s received", errSignal, s)) + case <-ctx.Done(): + } + }() err := cmd.ExecuteContext(ctx) if err == nil { return nil } - if errors.Is(err, ErrSignal) { + if errors.Is(err, errSignal) { return nil } + return err }