diff --git a/crates/base/src/runner.rs b/crates/base/src/runner.rs index d4c82f1..5c2b59b 100644 --- a/crates/base/src/runner.rs +++ b/crates/base/src/runner.rs @@ -92,11 +92,22 @@ impl ServerRunner { mut server, context, } = self; - // Init the adapter server (e.g. create underlying HTTP server) server.init(&context).await?; log::info!("Draco successfully initialized."); + #[cfg(unix)] + let sigterm = async { + use tokio::signal::unix::{SignalKind, signal}; + + let mut term = + signal(SignalKind::terminate()).expect("failed to install SIGTERM handler"); + term.recv().await; + }; + + #[cfg(not(unix))] + let sigterm = std::future::pending::<()>(); + match health_task { Some(mut ht) => { tokio::select! { @@ -113,28 +124,36 @@ impl ServerRunner { server.shutdown(&context).await?; } - // Ctrl+C / SIGINT + // Ctrl+C _ = signal::ctrl_c() => { log::info!("Ctrl+C/Exit signal received, shutting down adapter"); server.shutdown(&context).await?; ht.abort(); } + _ = sigterm => { + log::info!("SIGTERM received, shutting down adapter"); + server.shutdown(&context).await?; + ht.abort(); + } } } - None => { tokio::select! { - // Adapter server loop ends on its own - res = server.run(&context) => { - log::warn!("Adapter server finished"); - res?; - } - - // Ctrl+C / SIGINT - _ = signal::ctrl_c() => { - log::info!("Ctrl+C/Exit signal received, shutting down adapter"); - server.shutdown(&context).await?; - } + // Adapter server loop ends on its own + res = server.run(&context) => { + log::warn!("Adapter server finished"); + res?; + } + + // Ctrl+C + _ = signal::ctrl_c() => { + log::info!("Ctrl+C/Exit signal received, shutting down adapter"); + server.shutdown(&context).await?; + } + _ = sigterm => { + log::info!("SIGTERM received, shutting down adapter"); + server.shutdown(&context).await?; + } } } }