diff --git a/src/main.rs b/src/main.rs index f7df1800..2178755d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -199,12 +199,48 @@ fn main() -> std::io::Result<()> { .init(); info!("你好喵~"); - ctrlc::set_handler(move || { - //目前来看这个已经没用了,但以防万一卡死,还是留着好了 - error!("已关闭 biliroaming_rust_server"); - std::process::exit(0); - }) - .unwrap(); + // 同时处理 Ctrl+C (SIGINT) 与 systemd stop (SIGTERM),避免只响应 SIGINT + // 与原先 ctrlc 行为一致:收到信号后立即退出整个进程(含 background task 与 actix worker) + #[cfg(unix)] + { + use tokio::signal::unix::{signal, SignalKind}; + rt.spawn(async { + let mut sigint = match signal(SignalKind::interrupt()) { + Ok(s) => s, + Err(e) => { + error!("注册 SIGINT 处理器失败: {e}"); + return; + } + }; + let mut sigterm = match signal(SignalKind::terminate()) { + Ok(s) => s, + Err(e) => { + error!("注册 SIGTERM 处理器失败: {e}"); + return; + } + }; + tokio::select! { + _ = sigint.recv() => { + error!("收到 SIGINT,已关闭 biliroaming_rust_server"); + } + _ = sigterm.recv() => { + error!("收到 SIGTERM,已关闭 biliroaming_rust_server"); + } + } + std::process::exit(0); + }); + } + #[cfg(not(unix))] + { + rt.spawn(async { + if let Err(e) = tokio::signal::ctrl_c().await { + error!("注册 Ctrl+C 处理器失败: {e}"); + return; + } + error!("已关闭 biliroaming_rust_server"); + std::process::exit(0); + }); + } // //init server_config => BiliConfig //fs::write("config.example.yml", serde_yaml::to_string(&config).unwrap()).unwrap(); //Debug 方便生成示例配置 {