1package interrupt
2
3import (
4 "fmt"
5 "os"
6 "os/signal"
7 "syscall"
8)
9
10type Cleaner func() error
11
12var cleaners []Cleaner
13var inactive bool
14
15// RegisterCleaner is responsible for regisreting a cleaner function. When a function is registered, the Signal watcher is started in a goroutine.
16func RegisterCleaner(f Cleaner) {
17 cleaners = append(cleaners, f)
18 if !inactive {
19 inactive = false
20 go func() {
21 ch := make(chan os.Signal, 1)
22 signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
23 <-ch
24 // Prevent un-terminated ^C character in terminal
25 fmt.Println()
26 clean()
27 os.Exit(1)
28 }()
29 }
30}
31
32// Clean invokes all registered cleanup functions
33func clean() {
34 fmt.Println("Cleaning")
35 for _, f := range cleaners {
36 _ = f()
37 }
38 cleaners = []Cleaner{}
39}