Rust中ping请求异常过多?代码预期每分钟执行一次却高频发送
网络检测Rust代码异常请求量问题分析
我编写了一段用于检测网络连接的Rust代码,原本预期每分钟对google.com执行一次ping请求,但路由器显示每10分钟有200次请求。我疑惑是否创建了过多线程,但main函数仅运行一次。
代码片段
use std::process::Command; use std::thread; use std::time::Duration; fn network_connection() { loop { let output = Command::new("ping") .arg("-c") .arg("1") .arg("google.com") .output() .expect("[ ERR ] Failed to execute network check process"); let network_status = output.status; if network_status.success() == false { Command::new("init") .arg("6"); } thread::sleep(Duration::from_millis(60000)); } } fn main() { thread::spawn(|| { network_connection(); }); ...
问题排查与解决建议
程序提前退出导致重复启动
你的main函数仅创建子线程但未等待其执行,程序会在spawn线程后立刻退出。如果该程序被配置为守护进程或系统服务(比如systemd管理),服务可能因进程退出反复重启,每次重启都会触发一次ping请求,多实例叠加就会导致请求量暴增。
修复方式:在main中添加线程等待逻辑:fn main() { let thread_handle = thread::spawn(|| { network_connection(); }); // 等待子线程结束,避免main提前退出 thread_handle.join().expect("Network check thread panicked"); }未执行的重启命令不影响请求量
代码中Command::new("init").arg("6")仅构建了命令对象,未调用output()或spawn()执行,这部分逻辑不会生效,也不会导致ping请求量异常。验证程序运行实例数
通过系统命令(如ps aux | grep <你的程序名>)查看当前运行的程序实例数量,如果存在多个实例,说明程序被重复启动,需排查服务配置或启动脚本的问题。添加日志辅助排查
在代码中加入日志输出,记录程序启动时间和每次ping的执行时间,可直观确认是否因多实例运行导致请求量异常:use chrono::Local; // 需要在Cargo.toml中添加chrono依赖 fn network_connection() { loop { let now = Local::now().format("%Y-%m-%d %H:%M:%S").to_string(); println!("[{}] Executing ping check", now); let output = Command::new("ping") .arg("-c") .arg("1") .arg("google.com") .output() .expect("[ ERR ] Failed to execute network check process"); let network_status = output.status; if !network_status.success() { println!("[{}] Network failed, attempting reboot", now); // 补充执行重启命令的逻辑 Command::new("init") .arg("6") .output() .expect("[ ERR ] Failed to execute reboot"); } thread::sleep(Duration::from_millis(60000)); } }
内容的提问来源于stack exchange,提问作者Marcel Kopera
相关产品推荐
相关产品推荐

