From 6494c37783753c35f8a70beb15c79c3a24623139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anton=20=C3=96sterberg?= Date: Wed, 4 Feb 2026 12:01:45 +0100 Subject: [PATCH] feat: Handle SIGINT/SIGTERM --- src/main.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 7649094..5d95e45 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,7 +38,40 @@ async fn main() { let addr: SocketAddr = cfg.address().unwrap(); log::info!("Running flagpole on {:?}", addr); - axum::Server::bind(&addr).serve(router.into_make_service()).await.unwrap(); + + axum::Server::bind(&addr) + .serve(router.into_make_service()) + .with_graceful_shutdown(shutdown_signal()) + .await + .unwrap(); + + log::info!("Server shutdown complete"); +} + +async fn shutdown_signal() { + let ctrl_c = async { + tokio::signal::ctrl_c().await.expect("failed to install CTRL+C signal handler"); + }; + + #[cfg(unix)] + let terminate = async { + tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) + .expect("failed to install SIGTERM signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => { + log::info!("Received SIGINT (CTRL+C), initiating graceful shutdown"); + }, + _ = terminate => { + log::info!("Received SIGTERM, initiating graceful shutdown"); + }, + } } #[derive(Clone)]