diff --git a/src/main.rs b/src/main.rs index 6a871cf..e75a8f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use axum::Router; use axum::routing::get; use sqlx::mysql::MySqlPoolOptions; +use tokio::signal; use axum_sqlx::{config::AppConfig, handler, model::state::AppState}; @@ -40,5 +41,29 @@ async fn main() { tracing::info!("服务器运行于: {}", listener.local_addr().unwrap()); - axum::serve(listener, app).await.unwrap() + axum::serve(listener, app).with_graceful_shutdown(shutdown_signal()).await.unwrap() } + + +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 => {}, + } + tracing::info!("signal received, starting graceful shutdown"); +} \ No newline at end of file