Rust使用ScheduledThreadPool创建守护进程如何保持永久运行?
问题原因
Rust进程的生命周期完全绑定main函数,main返回后操作系统会直接回收所有进程资源,无论后台是否还有运行的子线程。你用到的scheduled_thread_pool的execute_at_fixed_rate方法会立即返回,不会阻塞调用线程,所以main函数会直接执行完毕,导致进程退出,定时任务随之终止。
解决方案
你只需要阻塞main函数,不让它返回即可,常用的实现方式有以下两种:
方案1:最简无限休眠(无优雅退出)
直接在main函数末尾添加无限循环的休眠逻辑,该方案几乎不占用CPU资源,满足永久运行的基本需求:
use scheduled_thread_pool::ScheduledThreadPool; use std::time::Duration; fn do_business_logic() { // 此处为你的业务逻辑 println!("定时任务执行"); } fn main() { let pool = ScheduledThreadPool::new(1); pool.execute_at_fixed_rate( Duration::new(5, 0), Duration::new(5, 0), move || do_business_logic(), ); // 无限阻塞main函数,防止进程退出 loop { std::thread::sleep(Duration::from_secs(3600)); } }
方案2:支持优雅退出
如果需要响应系统中断信号(比如用户按下Ctrl+C)、退出前清理资源,可以监听系统信号,收到终止信号后再退出main函数:
- 先在
Cargo.toml中添加依赖:[dependencies] scheduled-thread-pool = "0.2" signal-hook = "0.3" - 完整代码示例:
use scheduled_thread_pool::ScheduledThreadPool; use signal_hook::{consts::SIGINT, iterator::Signals}; use std::time::Duration; fn do_business_logic() { println!("定时任务执行"); } fn main() { let pool = ScheduledThreadPool::new(1); pool.execute_at_fixed_rate( Duration::new(5, 0), Duration::new(5, 0), move || do_business_logic(), ); // 监听SIGINT中断信号 let mut signals = Signals::new(&[SIGINT]).unwrap(); for signal in signals.forever() { if signal == SIGINT { println!("收到终止信号,进程即将退出"); // 此处可添加自定义清理逻辑 break; } } }
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

