diff --git a/src/iocaine/app.rs b/src/iocaine/app.rs index 85263f4..f92241a 100644 --- a/src/iocaine/app.rs +++ b/src/iocaine/app.rs @@ -52,7 +52,29 @@ impl Iocaine { .layer(Extension(self.clone())) .layer(tower_http::trace::TraceLayer::new_for_http()); let listener = tokio::net::TcpListener::bind(bind).await?; - axum::serve(listener, app).await + axum::serve(listener, app) + .with_graceful_shutdown(shutdown_signal()) + .await + } +} + +async fn shutdown_signal() { + let ctrl_c = async { + tokio::signal::ctrl_c() + .await + .expect("failed to install Ctrl+C handler"); + }; + + let terminate = async { + tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) + .expect("failed to install signal handler") + .recv() + .await; + }; + + tokio::select! { + _ = ctrl_c => {}, + _ = terminate => {}, } }