mirror of
https://github.com/pocket-id/pocket-id.git
synced 2025-12-18 01:11:26 +03:00
refactor: graceful shutdown for server (#482)
This commit is contained in:
committed by
GitHub
parent
ce24372c57
commit
3ec98736cf
40
backend/internal/utils/signals/signal.go
Normal file
40
backend/internal/utils/signals/signal.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package signals
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
/*
|
||||
This code is adapted from:
|
||||
https://github.com/kubernetes-sigs/controller-runtime/blob/8499b67e316a03b260c73f92d0380de8cd2e97a1/pkg/manager/signals/signal.go
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
License: Apache2 (https://github.com/kubernetes-sigs/controller-runtime/blob/8499b67e316a03b260c73f92d0380de8cd2e97a1/LICENSE)
|
||||
*/
|
||||
|
||||
var onlyOneSignalHandler = make(chan struct{})
|
||||
|
||||
// SignalContext returns a context that is canceled when the application receives an interrupt signal.
|
||||
// A second signal forces an immediate shutdown.
|
||||
func SignalContext(parentCtx context.Context) context.Context {
|
||||
close(onlyOneSignalHandler) // Panics when called twice
|
||||
|
||||
ctx, cancel := context.WithCancel(parentCtx)
|
||||
|
||||
sigCh := make(chan os.Signal, 2)
|
||||
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
|
||||
go func() {
|
||||
<-sigCh
|
||||
log.Println("Received interrupt signal. Shutting down…")
|
||||
cancel()
|
||||
|
||||
<-sigCh
|
||||
log.Println("Received a second interrupt signal. Forcing an immediate shutdown.")
|
||||
os.Exit(1)
|
||||
}()
|
||||
|
||||
return ctx
|
||||
}
|
||||
Reference in New Issue
Block a user