github.com/orangenpresse/up@v0.6.0/internal/signal/signal.go (about)

     1  package signal
     2  
     3  import (
     4  	"os"
     5  	"os/signal"
     6  	"syscall"
     7  
     8  	"github.com/apex/up/internal/util"
     9  )
    10  
    11  // close funcs.
    12  var fns []Func
    13  
    14  // Init signals channel
    15  func init() {
    16  	s := make(chan os.Signal, 1)
    17  	go trap(s)
    18  	signal.Notify(s, syscall.SIGINT)
    19  }
    20  
    21  // Func is a close function.
    22  type Func func() error
    23  
    24  // Add registers a close handler func.
    25  func Add(fn Func) {
    26  	fns = append(fns, fn)
    27  }
    28  
    29  // trap signals to invoke callbacks and exit.
    30  func trap(ch chan os.Signal) {
    31  	<-ch
    32  	for _, fn := range fns {
    33  		if err := fn(); err != nil {
    34  			util.Fatal(err)
    35  		}
    36  	}
    37  	os.Exit(1)
    38  }