From 52bb1e2140f0fc91d6831e1835a1579e7b119741 Mon Sep 17 00:00:00 2001 From: monosans Date: Wed, 23 Jul 2025 16:16:12 +0300 Subject: [PATCH] feat: implement signal handling for UNIX systems in watch_signals function --- src/main.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index c989fc5..877d97b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -232,7 +232,54 @@ async fn run_with_tui( Ok(()) } -#[cfg(not(feature = "tui"))] +#[cfg(all(unix, not(feature = "tui")))] +async fn watch_signals(token: tokio_util::sync::CancellationToken) { + let token_clone = token.clone(); + tokio::select! { + biased; + () = token_clone.cancelled() => {}, + () = async move { + match ( + tokio::signal::unix::signal( + tokio::signal::unix::SignalKind::interrupt(), + ), + tokio::signal::unix::signal( + tokio::signal::unix::SignalKind::terminate(), + ) + ) { + (Ok(mut a), Ok(mut b)) => { + tokio::select! { + _ = a.recv() => { + tracing::info!("Received SIGINT, exiting..."); + token.cancel(); + }, + _ = b.recv() => { + tracing::info!("Received SIGTERM, exiting..."); + token.cancel(); + } + }; + } + (Err(e), Ok(mut s)) => { + tracing::warn!("Failed to create SIGINT handler: {}", e); + s.recv().await; + tracing::info!("Received SIGTERM, exiting..."); + token.cancel(); + } + (Ok(mut s), Err(e)) => { + tracing::warn!("Failed to create SIGTERM handler: {}", e); + s.recv().await; + tracing::info!("Received SIGINT, exiting..."); + token.cancel(); + } + (Err(e), Err(e2)) => { + tracing::warn!("Failed to create signal handlers: {}, {}", e, e2); + } + } + } => {} + }; +} + +#[cfg(all(not(unix), not(feature = "tui")))] async fn watch_signals(token: tokio_util::sync::CancellationToken) { let token_clone = token.clone(); tokio::select! {