Files
coredns/core/sigtrap_posix.go

80 lines
1.7 KiB
Go
Raw Normal View History

2016-03-18 20:57:35 +00:00
// +build !windows
package core
import (
"io/ioutil"
"log"
"os"
"os/signal"
"syscall"
)
// trapSignalsPosix captures POSIX-only signals.
func trapSignalsPosix() {
go func() {
sigchan := make(chan os.Signal, 1)
signal.Notify(sigchan, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGUSR1)
for sig := range sigchan {
switch sig {
case syscall.SIGTERM:
log.Println("[INFO] SIGTERM: Terminating process")
if PidFile != "" {
os.Remove(PidFile)
}
os.Exit(0)
case syscall.SIGQUIT:
log.Println("[INFO] SIGQUIT: Shutting down")
exitCode := executeShutdownCallbacks("SIGQUIT")
err := Stop()
if err != nil {
log.Printf("[ERROR] SIGQUIT stop: %v", err)
exitCode = 1
}
if PidFile != "" {
os.Remove(PidFile)
}
os.Exit(exitCode)
case syscall.SIGHUP:
log.Println("[INFO] SIGHUP: Hanging up")
err := Stop()
if err != nil {
log.Printf("[ERROR] SIGHUP stop: %v", err)
}
case syscall.SIGUSR1:
log.Println("[INFO] SIGUSR1: Reloading")
var updatedCorefile Input
2016-03-18 20:57:35 +00:00
corefileMu.Lock()
if corefile == nil {
2016-03-18 20:57:35 +00:00
// Hmm, did spawing process forget to close stdin? Anyhow, this is unusual.
log.Println("[ERROR] SIGUSR1: no Corefile to reload (was stdin left open?)")
corefileMu.Unlock()
2016-03-18 20:57:35 +00:00
continue
}
if corefile.IsFile() {
body, err := ioutil.ReadFile(corefile.Path())
2016-03-18 20:57:35 +00:00
if err == nil {
updatedCorefile = CorefileInput{
Filepath: corefile.Path(),
2016-03-18 20:57:35 +00:00
Contents: body,
RealFile: true,
}
}
}
corefileMu.Unlock()
2016-03-18 20:57:35 +00:00
err := Restart(updatedCorefile)
2016-03-18 20:57:35 +00:00
if err != nil {
log.Printf("[ERROR] SIGUSR1: %v", err)
}
}
}
}()
}