From 334fdce7510383209e85d2af4bade55033f396ef Mon Sep 17 00:00:00 2001 From: adrianc Date: Mon, 17 Jun 2024 18:54:03 +0300 Subject: [PATCH] Add signals package this provides a simple way to handle incoming os signas using context Signed-off-by: adrianc --- pkg/signals/signals.go | 45 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 pkg/signals/signals.go diff --git a/pkg/signals/signals.go b/pkg/signals/signals.go new file mode 100644 index 000000000..17d05bc3c --- /dev/null +++ b/pkg/signals/signals.go @@ -0,0 +1,45 @@ +// Copyright (c) 2024 Multus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package signals provides handling for os signals. +package signals + +import ( + "context" + "os" + "os/signal" + "syscall" +) + +var onlyOneSignalHandler = make(chan struct{}) + +// SetupSignalHandler registers for SIGTERM and SIGINT. A context is returned +// which is canceled on one of these signals. If a second signal is caught, the program +// is terminated with exit code 1. +func SetupSignalHandler() context.Context { + close(onlyOneSignalHandler) // panics when called twice + + ctx, cancel := context.WithCancel(context.Background()) + + c := make(chan os.Signal, 2) + signal.Notify(c, syscall.SIGINT, syscall.SIGTERM) + go func() { + <-c + cancel() + <-c + os.Exit(1) // second signal. Exit directly. + }() + + return ctx +}