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)