La nouvelle API est fn(os.Signal, fn(os.Signal)) au lieu de chan+variadic. Enregistrement séparé pour .hup, .int, .term.
This commit is contained in:
@@ -120,30 +120,34 @@ pub fn (mut app App) run() ! {
|
||||
|
||||
$if linux || macos {
|
||||
fn (mut app App) handle_signals() {
|
||||
mut sigch := chan os.Signal{cap: 10}
|
||||
os.signal_opt(mut sigch, .int, .term, .hup) or { panic(err) }
|
||||
for {
|
||||
sig := <-sigch
|
||||
match sig {
|
||||
.hup {
|
||||
app.logger.info('server', 'reload', 'SIGHUP received, reloading config...')
|
||||
new_cfg := load_config(app.config_path) or {
|
||||
app.logger.error('server', 'reload', 'failed to reload config: ${err}')
|
||||
continue
|
||||
}
|
||||
app.cfg = new_cfg
|
||||
app.webhook_routes = build_webhook_routes(new_cfg)
|
||||
app.ntfy = new_ntfy_client(new_cfg.server, app.logger)
|
||||
app.dedup = new_dedup(new_cfg.dedup)
|
||||
app.logger.info('server', 'reload', 'config reloaded successfully')
|
||||
}
|
||||
.int, .term {
|
||||
app.logger.info('server', 'shutdown', 'received signal, shutting down...')
|
||||
app.shutdown_flag = true
|
||||
time.sleep(500 * time.millisecond)
|
||||
exit(0)
|
||||
}
|
||||
// Register SIGHUP handler for config reload
|
||||
os.signal_opt(.hup, fn [mut app] (sig os.Signal) {
|
||||
app.logger.info('server', 'reload', 'SIGHUP received, reloading config...')
|
||||
new_cfg := load_config(app.config_path) or {
|
||||
app.logger.error('server', 'reload', 'failed to reload config: ${err}')
|
||||
return
|
||||
}
|
||||
app.cfg = new_cfg
|
||||
app.webhook_routes = build_webhook_routes(new_cfg)
|
||||
app.ntfy = new_ntfy_client(new_cfg.server, app.logger)
|
||||
app.dedup = new_dedup(new_cfg.dedup)
|
||||
app.logger.info('server', 'reload', 'config reloaded successfully')
|
||||
}) or { panic(err) }
|
||||
|
||||
// Common shutdown handler for SIGINT and SIGTERM
|
||||
shutdown := fn [mut app] (sig os.Signal) {
|
||||
app.logger.info('server', 'shutdown', 'received signal, shutting down...')
|
||||
app.shutdown_flag = true
|
||||
time.sleep(500 * time.millisecond)
|
||||
exit(0)
|
||||
}
|
||||
|
||||
os.signal_opt(.int, shutdown) or { panic(err) }
|
||||
os.signal_opt(.term, shutdown) or { panic(err) }
|
||||
|
||||
// Keep goroutine alive
|
||||
for {
|
||||
time.sleep(60 * time.second)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user