This package provides convenient interface for working with os.Signal.
Multiple hooks can be applied, they will be called simultaneously on app shutdown.
package main import ( "log" "time" "github.com/ztrue/shutdown" ) func main() { shutdown.Add(func() { // Write log. // Stop writing files. // Close connections. // Etc. log.Println("Stopping...") log.Println("3") time.Sleep(time.Second) log.Println("2") time.Sleep(time.Second) log.Println("1") time.Sleep(time.Second) log.Println("0, stopped") }) // App emulation. go func() { log.Println("App running, press CTRL + C to stop") select {} }() shutdown.Listen() }Find more executable examples in examples dir.
import "github.com/ztrue/shutdown"shutdown.Add(func() { log.Println("Stopping") })key := shutdown.Add(func() { log.Println("Stopping") }) shutdown.Remove(key)shutdown.AddWithKey("mykey", func() { log.Println("Stopping") }) shutdown.Remove("mykey")shutdown.AddWithParam(func(os.Signal) { log.Println("Stopping because of", os.Signal) })shutdown.Listen(syscall.SIGINT, syscall.SIGTERM)Reload service on SIGHUP
shutdown.AddWithParam(func(sig os.Signal) { if sig == syscall.SIGHUP { log.Println( "Reload conf...") reloadConf() // listen again signals to avoid shutdown shutdown.Listen(syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) } else { // SIGINT, SIGTERM log.Println("Stopping...") } }) shutdown.Listen(syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)