cloudflared-mirror/cmd/cloudflared/tunnel/signal.go

44 lines
1.2 KiB
Go

package tunnel
import (
"os"
"os/signal"
"syscall"
"github.com/rs/zerolog"
)
// waitForSignal handles OS signals for graceful shutdown and configuration reload.
// It closes graceShutdownC on SIGTERM/SIGINT to trigger graceful shutdown.
// If reloadC is provided, SIGHUP will send a reload signal instead of being ignored.
func waitForSignal(graceShutdownC chan struct{}, reloadC chan<- struct{}, logger *zerolog.Logger) {
signals := make(chan os.Signal, 10)
signal.Notify(signals, syscall.SIGTERM, syscall.SIGINT, syscall.SIGHUP)
defer signal.Stop(signals)
for {
select {
case s := <-signals:
switch s {
case syscall.SIGHUP:
if reloadC != nil {
logger.Info().Msg("Received SIGHUP, triggering configuration reload")
select {
case reloadC <- struct{}{}:
default:
logger.Warn().Msg("Configuration reload already in progress, skipping")
}
} else {
logger.Info().Msg("Received SIGHUP but hot reload is not enabled for this tunnel")
}
case syscall.SIGTERM, syscall.SIGINT:
logger.Info().Msgf("Initiating graceful shutdown due to signal %s ...", s)
close(graceShutdownC)
return
}
case <-graceShutdownC:
return
}
}
}