mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-25 17:56:34 +08:00
c8514ad7b7
See: https://forum.caddyserver.com/t/reloading-template-files-as-they-change/1483/3?u=matt The server takes a moment to start; if USR1 is received before the instance is saved, it would panic because no instances have been saved. Instead, we just ignore the signal since no config has finished loading.
91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
// +build !windows
|
|
|
|
package caddy
|
|
|
|
import (
|
|
"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")
|
|
|
|
// Start with the existing Caddyfile
|
|
instancesMu.Lock()
|
|
if len(instances) == 0 {
|
|
instancesMu.Unlock()
|
|
log.Println("[ERROR] SIGUSR1: No server instances are fully running")
|
|
continue
|
|
}
|
|
inst := instances[0] // we only support one instance at this time
|
|
instancesMu.Unlock()
|
|
|
|
updatedCaddyfile := inst.caddyfileInput
|
|
if updatedCaddyfile == nil {
|
|
// Hmm, did spawing process forget to close stdin? Anyhow, this is unusual.
|
|
log.Println("[ERROR] SIGUSR1: no Caddyfile to reload (was stdin left open?)")
|
|
continue
|
|
}
|
|
if loaderUsed.loader == nil {
|
|
// This also should never happen
|
|
log.Println("[ERROR] SIGUSR1: no Caddyfile loader with which to reload Caddyfile")
|
|
continue
|
|
}
|
|
|
|
// Load the updated Caddyfile
|
|
newCaddyfile, err := loaderUsed.loader.Load(inst.serverType)
|
|
if err != nil {
|
|
log.Printf("[ERROR] SIGUSR1: loading updated Caddyfile: %v", err)
|
|
continue
|
|
}
|
|
if newCaddyfile != nil {
|
|
updatedCaddyfile = newCaddyfile
|
|
}
|
|
|
|
// Kick off the restart; our work is done
|
|
inst, err = inst.Restart(updatedCaddyfile)
|
|
if err != nil {
|
|
log.Printf("[ERROR] SIGUSR1: %v", err)
|
|
}
|
|
}
|
|
}
|
|
}()
|
|
}
|