41 lines
1,010 B
Go
41 lines
1,010 B
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/restic/restic/internal/debug"
|
|
)
|
|
|
|
func createGlobalContext() context.Context {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
|
|
ch := make(chan os.Signal, 1)
|
|
go cleanupHandler(ch, cancel)
|
|
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
return ctx
|
|
}
|
|
|
|
// cleanupHandler handles the SIGINT and SIGTERM signals.
|
|
func cleanupHandler(c <-chan os.Signal, cancel context.CancelFunc) {
|
|
s := <-c
|
|
debug.Log("signal %v received, cleaning up", s)
|
|
Warnf("%ssignal %v received, cleaning up\n", clearLine(0), s)
|
|
|
|
if val, _ := os.LookupEnv("RESTIC_DEBUG_STACKTRACE_SIGINT"); val != "" {
|
|
_, _ = os.Stderr.WriteString("\n--- STACKTRACE START ---\n\n")
|
|
_, _ = os.Stderr.WriteString(debug.DumpStacktrace())
|
|
_, _ = os.Stderr.WriteString("\n--- STACKTRACE END ---\n")
|
|
}
|
|
|
|
cancel()
|
|
}
|
|
|
|
// Exit terminates the process with the given exit code.
|
|
func Exit(code int) {
|
|
debug.Log("exiting with status code %d", code)
|
|
os.Exit(code)
|
|
}
|