From 3d9777d81a2d2ec71c5bee08c91a8fcc31930670 Mon Sep 17 00:00:00 2001 From: maurice Date: Sat, 14 Nov 2026 19:33:06 +0100 Subject: [PATCH] signals --- Cargo.lock | 21 +++++++++++++++++++++ Cargo.toml | 2 +- src/main.rs | 20 +++++++++++++++++++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b467a5..1e7db4c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -416,6 +416,16 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "etcetera" version = "0.11.0" @@ -1284,6 +1294,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + [[package]] name = "slab" version = "0.4.12" @@ -1591,6 +1611,7 @@ dependencies = [ "libc", "mio", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", "windows-sys", diff --git a/Cargo.toml b/Cargo.toml index ad573a8..c6e52aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,5 +14,5 @@ pulldown-cmark = { version = "0.9.6", default-features = false } rand = "0.10.3" serde = { version = "1.0.229", features = ["derive"] } sqlx = { version = "0.9.0", features = ["runtime-tokio", "sqlite"] } -tokio = { version = "1.54.1", features = ["rt-multi-thread"] } +tokio = { version = "1.54.1", features = ["rt-multi-thread", "signal"] } tower-http = { version = "0.7.1", features = ["fs"] } diff --git a/src/main.rs b/src/main.rs index 4929da6..d151236 100644 --- a/src/main.rs +++ b/src/main.rs @@ -53,6 +53,24 @@ async fn main() -> Result<(), Box> { let port = std::env::var("PORT").unwrap_or_else(|_| "3000".to_owned()); let listener = TcpListener::bind(format!("0.0.0.0:{port}")).await?; println!("Listening on http://localhost:{port}"); - serve(listener, app).await?; + serve(listener, app) + .with_graceful_shutdown(shutdown_signal()) + .await?; Ok(()) } + +async fn shutdown_signal() { + let terminate = async { + tokio::signal::unix::signal(tokio::signal::unix::SignalKind::terminate()) + .expect("Failed to install SIGTERM handler") + .recv() + .await; + }; + + tokio::select! { + result = tokio::signal::ctrl_c() => { + result.expect("Failed to install Ctrl+C handler"); + } + _ = terminate => {} + } +}