From: Greg Burri Date: Wed, 26 Mar 2025 17:38:14 +0000 (+0100) Subject: Graceful shutdown with CTRL-C X-Git-Url: https://git.euphorik.ch/?a=commitdiff_plain;h=4ddc12ba280866e17de00afddac285acdcf0d136;p=recipes.git Graceful shutdown with CTRL-C --- diff --git a/backend/src/main.rs b/backend/src/main.rs index db0e2d7..4df3338 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -14,6 +14,7 @@ use chrono::prelude::*; use clap::Parser; use config::Config; use itertools::Itertools; +use tokio::signal; use tower::layer::Layer; use tower::{ServiceBuilder, buffer::BufferLayer, limit::RateLimitLayer}; use tower_http::{ @@ -303,8 +304,11 @@ async fn main() { listener, app_with_url_rewriting.into_make_service_with_connect_info::(), ) + .with_graceful_shutdown(shutdown_signal()) .await .unwrap(); + + event!(Level::INFO, "Recipes stopped"); } async fn user_authentication( @@ -506,3 +510,27 @@ async fn process_args() -> bool { true } + +async fn shutdown_signal() { + let ctrl_c = async { + signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + #[cfg(unix)] + let terminate = async { + signal::unix::signal(signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + #[cfg(not(unix))] + let terminate = std::future::pending::<()>(); + + tokio::select! { + _ = ctrl_c => {}, + _ = terminate => {}, + } +}