rust代码无法在部分机器上正常启动
部署的机器都是Debian12 x86架构
use std::sync::atomic::AtomicBool;use std::sync::Arc;mod watchdog;mod web;static mut NORMAL_LIST: Vec<String> = Vec::new();static mut REALITY_LIST: Vec<String> = Vec::new();#[tokio::main]pub async fn main() { // 处理 Ctrl-C 信号 let running = Arc::new(AtomicBool::new(true)); ctrlc::set_handler(move || { std::process::exit(0); }) .expect("Error setting Ctrl-C handler"); tokio::spawn(async { watchdog::start_watch().await; }); tokio::spawn(async { web::start_web().await; }); while running.load(std::sync::atomic::Ordering::Relaxed) { tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; }}
use rand::seq::SliceRandom;use salvo::http::HeaderValue;use salvo::http::StatusCode;use salvo::logging::Logger;use salvo::prelude::*;use crate::*;#[handler]pub async fn avatar(res: &mut Response, req: &Request) { // 获取 Host let host = match req.headers().get("Host") { Some(t) => t.to_str().unwrap(), _ => { res.status_code(StatusCode::BAD_REQUEST); return; } }; // 拼接字符串,转成url编码 let host = host.splitn(2, '.').nth(1).unwrap_or(""); let host = format!("resources.{host}"); // 获取 协议类型 let protocol = match req .headers() .get("scheme") .unwrap_or(&HeaderValue::from_static("https")) .to_str() .unwrap() { "http" => "http", _ => "https", }; // 拼接字符串,转成url编码 let host = host.splitn(2, '.').nth(1).unwrap_or(""); let host = format!("resources.{host}"); // 随机从 NORMAL_LIST 中选择一个文件名 unsafe { let file_name = urlencoding::encode(NORMAL_LIST.choose(&mut rand::thread_rng()).unwrap()); res.render(Redirect::found(format!( "{protocol}://{host}/avatar/{file_name}" ))); }}#[handler]pub async fn random(res: &mut Response, req: &Request) { // 获取查询参数 let img_type = match req.query::<&str>("type") { Some("reality") => "reality", _ => "normal", }; // 获取 Host let host = match req.headers().get("Host") { Some(t) => t.to_str().unwrap(), _ => { res.status_code(StatusCode::BAD_REQUEST); return; } }; // 拼接字符串,转成url编码 let host = host.splitn(2, '.').nth(1).unwrap_or(""); let host = format!("resources.{host}"); // 获取 协议类型 let protocol = match req .headers() .get("scheme") .unwrap_or(&HeaderValue::from_static("https")) .to_str() .unwrap() { "http" => "http", _ => "https", }; // 随机从中选择一个文件名 unsafe { let file_name = match img_type { "reality" => urlencoding::encode(REALITY_LIST.choose(&mut rand::thread_rng()).unwrap()), _ => urlencoding::encode(NORMAL_LIST.choose(&mut rand::thread_rng()).unwrap()), }; res.render(Redirect::found(format!( "{protocol}://{host}/{img_type}/{file_name}" ))); }}pub async fn start_web() { tracing_subscriber::fmt().try_init().unwrap(); let router = Router::with_path("yuri") .push(Router::with_path("random").get(random)) .push(Router::with_path("avatar.jpg").get(avatar)); let service = Service::new(router).hoop(Logger::new()); let acceptor = TcpListener::new("127.0.0.1:8081").bind().await; Server::new(acceptor).serve(service).await;}
use hotwatch::{Event, Hotwatch};use std::fs;use std::thread::sleep;use std::time::Duration;use crate::*;pub async fn start_watch() { // 获取目录下所有文件名 for path in fs::read_dir("../data/output/normal").unwrap() { unsafe { NORMAL_LIST.push(path.unwrap().file_name().to_str().unwrap().to_string()); } } for path in fs::read_dir("../data/output/reality").unwrap() { unsafe { REALITY_LIST.push(path.unwrap().file_name().to_str().unwrap().to_string()); } } let mut hotwatch = Hotwatch::new().expect("hotwatch failed to initialize!"); hotwatch .watch("../data/output/normal", |event: Event| match event.kind { _ => { // 清空 NORMAL_LIST unsafe { NORMAL_LIST.clear(); } // 获取目录下所有文件名 for path in fs::read_dir("../data/output/normal").unwrap() { unsafe { NORMAL_LIST.push(path.unwrap().file_name().to_str().unwrap().to_string()); } } } }) .expect("failed to watch file!"); hotwatch .watch("../data/output/reality", |event: Event| match event.kind { _ => { // 清空 NORMAL_LIST unsafe { REALITY_LIST.clear(); } // 获取目录下所有文件名 for path in fs::read_dir("../data/output/reality").unwrap() { unsafe { REALITY_LIST.push(path.unwrap().file_name().to_str().unwrap().to_string()); } } } }) .expect("failed to watch file!"); loop { sleep(Duration::from_secs(1)); }}
部分成功启动机器截图,请忽略找不到路径的报错
启动失败机器截图
尝试1
更改x86_64-unknown-linux-gnu为x86_64-unknown-linux-musl 无效
尝试2
在watchdog.rs中添加输出代码可以正常输出,在web.rs中进行同样操作没有输出
求大佬解答
原因为出现问题的机器只有单线程,代码中有两处使用到了tokio::spawn需要两个线程执行,所以web服务会等待watchdog结束才执行
你的问题可能涉及几个不同的方面,我将逐一进行分析。
NORMAL_LIST
和 REALITY_LIST
是全局的 Vec<String>
,并且使用 unsafe
块在不加锁的情况下进行读写操作。这在多线程环境下可能会导致数据竞争(race condition),这可能是导致部分机器启动失败的原因。你可以考虑使用线程安全的数据结构,如 std::sync::Mutex
或 std::collections::VecDeque
(如果你只需要在末尾添加和删除元素)来确保并发安全。hotwatch
库来监控文件系统的变化。这个库在某些系统或文件系统上可能表现不稳定。你可以考虑更换为其他更稳定的文件系统监控库,如 fsnotify
。watchdog.rs
和 web.rs
中,你可以添加日志输出以检查代码的执行流程和数据状态。综上所述,你需要对代码进行一些修改,以确保其在并发环境下的正确性,并考虑更换文件系统监控库、统一Rust和依赖库版本、添加更多调试信息、检查系统资源限制以及确保环境一致性等方面的问题。希望这些建议能对你有所帮助!
场景: 我试图在Sabayon Linux下的Visual Studio代码上调试ASP.NET核心项目。当我点击F5时,我得到以下消息: launch.json }
我有两个不同版本的Jenkins实例。其中一个版本是1.609.1,当我在它上创建一个从机时,我会在launch方法中看到如下选项: “通过SSH在Unix计算机上启动从代理” “通过Java web启动从代理” “通过在主服务器上执行命令启动从服务器,并让Jenkins作为Windows服务控制此Windows从服务器”
代码: 这段代码在本地运行良好,异常由catch块处理,我的代码继续执行,但当我在Jenkins上运行相同的代码时,catch块无法捕获异常。 日志:
我想写一个模拟 DNF 装备增幅的程序,通过多次样本执行得到平均每件增幅 10 装备需要增幅多少次。装备 +4 之前不会失败,+4 之后会失败且失败后还会掉级,具体如下图所示: 公会秘药和普雷宠物会额外增加每次增幅的成功率 1% 和 4%,所以一共分了三种情况。 我最开始用 js 写了一版: 后来想到我刚学了 rust,不如练练手,而且 rust 很快,于是又写了一版: 然而实际上 rust 代码
问题内容: 这是我的php文件中的一个函数,用于满足我的android应用程序的请求。 您会看到我已经隐藏了一些代码,因为我正在调试它,所以创建了一些文件只是为了查看代码的哪一部分无法执行。我发现程序无法进入应创建file4的区域。我已经发现问题可能出在$ query上,当它执行时,mysql将响应“未知表状态:TABLE_TYPE”,这是我无法理解的。 问题答案: 如上面的注释中所述,您应该分而
问题内容: 我已经下载,解压缩并使用一些插件(值得注意的,EPIC,Clearcase,QuantumDB,MisterQ)设置了Eclipse 3.4.2。 现在,我在编辑Java项目时发现代码完成无法正常工作。如果我键入并按,则弹出窗口将显示“无默认提案”,底部的状态栏将显示“无可用完成”。 问题答案: 尝试还原 中的默认选项 你在此首选项屏幕中看到的数据类型的示例,但是不一定是你当前拥有的数