From 6baf7c903373d09807c69b1d331d57e7b37fae63 Mon Sep 17 00:00:00 2001 From: Rob Prentiss Date: Tue, 24 Jan 2023 18:04:56 -0800 Subject: [PATCH] Handle SIGTERM on unix-like OS (#1805) --- cmd/proxy/main.go | 6 ++++-- internal/shutdown/signals.go | 15 +++++++++++++++ internal/shutdown/signals_notunix.go | 10 ++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 internal/shutdown/signals.go create mode 100644 internal/shutdown/signals_notunix.go diff --git a/cmd/proxy/main.go b/cmd/proxy/main.go index 6c016c63..dafd68e2 100644 --- a/cmd/proxy/main.go +++ b/cmd/proxy/main.go @@ -13,6 +13,7 @@ import ( _ "net/http/pprof" "github.com/gomods/athens/cmd/proxy/actions" + "github.com/gomods/athens/internal/shutdown" "github.com/gomods/athens/pkg/build" "github.com/gomods/athens/pkg/config" ) @@ -51,8 +52,9 @@ func main() { go func() { sigint := make(chan os.Signal, 1) - signal.Notify(sigint, os.Interrupt) - <-sigint + signal.Notify(sigint, shutdown.GetSignals()...) + s := <-sigint + log.Printf("Recived signal (%s): Shutting down server", s) // We received an interrupt signal, shut down. ctx, cancel := context.WithTimeout(context.Background(), time.Second*time.Duration(conf.ShutdownTimeout)) diff --git a/internal/shutdown/signals.go b/internal/shutdown/signals.go new file mode 100644 index 00000000..27f3bdc0 --- /dev/null +++ b/internal/shutdown/signals.go @@ -0,0 +1,15 @@ +//go:build unix + +package shutdown + +import ( + "os" + "syscall" +) + +// GetSignals returns the appropriate signals to catch for a clean shutdown, dependent on the OS. +// +// On Unix-like operating systems, it is important to catch SIGTERM in addition to SIGINT. +func GetSignals() []os.Signal { + return []os.Signal{os.Interrupt, syscall.SIGTERM} +} diff --git a/internal/shutdown/signals_notunix.go b/internal/shutdown/signals_notunix.go new file mode 100644 index 00000000..b2d5248c --- /dev/null +++ b/internal/shutdown/signals_notunix.go @@ -0,0 +1,10 @@ +//go:build !unix + +package shutdown + +import "os" + +// GetSignals returns the appropriate signals to catch for a clean shutdown, dependent on the OS. +func GetSignals() []os.Signal { + return []os.Signal{os.Interrupt} +}