From 447d0192eda735dee1e170f8f8985a01fbb10fd6 Mon Sep 17 00:00:00 2001 From: monosans Date: Wed, 16 Jul 2025 13:54:42 +0300 Subject: [PATCH] fix: improve signal handling for SIGINT, SIGTERM, and Ctrl+C with enhanced error logging --- src/main.rs | 90 +++++++++++++++++++++++++++++------------------------ 1 file changed, 49 insertions(+), 41 deletions(-) diff --git a/src/main.rs b/src/main.rs index e3324b9..dc59696 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,41 +180,42 @@ async fn process_proxies( async fn watch_signals( token: tokio_util::sync::CancellationToken, ) -> color_eyre::Result<()> { - 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..."); + 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)) | (Ok(mut s), Err(e)) => { + tracing::warn!("Failed to create signal handler: {}", e); + s.recv().await; token.cancel(); - }, - _ = b.recv() => { - tracing::info!("Received SIGTERM, exiting..."); - token.cancel(); - }, + } + (Err(e), Err(e2)) => { + tracing::warn!("Failed to create signal handlers: {}, {}", e, e2); + } } - } - (Ok(mut s), Err(e)) => { - tracing::warn!("Failed to create SIGTERM handler: {}", e); - s.recv().await; - token.cancel(); - } - (Err(e), Ok(mut s)) => { - tracing::warn!("Failed to create SIGINT handler: {}", e); - s.recv().await; - token.cancel(); - } - (Err(e), Err(e2)) => { - tracing::warn!("Failed to create SIGINT handler: {}", e); - tracing::warn!("Failed to create SIGTERM handler: {}", e2); - } - } + } => {} + }; Ok(()) } @@ -222,15 +223,22 @@ async fn watch_signals( async fn watch_signals( token: tokio_util::sync::CancellationToken, ) -> color_eyre::Result<()> { - match tokio::signal::ctrl_c().await { - Ok(()) => { - tracing::info!("Received Ctrl+C, exiting..."); - token.cancel(); + let token_clone = token.clone(); + tokio::select! { + biased; + () = token_clone.cancelled() => {}, + ctrl_c = tokio::signal::ctrl_c() => { + match ctrl_c { + Ok(()) => { + tracing::info!("Received Ctrl+C, exiting..."); + token.cancel(); + } + Err(e) => { + tracing::warn!("Failed to create Ctrl+C handler: {}", e); + } + } } - Err(e) => { - tracing::warn!("Failed to create Ctrl+C handler: {}", e); - } - } + }; Ok(()) }