2

这个问题是指截至 2014 年 10 月的 Rust。

如果您使用的是 Rust 1.0 或更高版本,您最好在别处寻找解决方案。


我有一个长时间运行的 Rust 进程,它生成日志值,我正在使用Process运行它。

它看起来虽然我可能能够定期“检查”正在运行的进程,并使用set_timeout()wait()执行某种高级循环,例如:

let mut child = match Command::new("thing").arg("...").spawn() {
    Ok(child) => child,
    Err(e) => fail!("failed to execute child: {}", e),
};
loop {
    child.set_timeout(Some(100));
    match child.wait() {
        // ??? Something goes here
    }
}

我不是100%的事情是;我如何区分超时错误和进程返回错误之间的区别wait(),以及如何使用PipeStream“在不阻塞流的情况下尽可能多地读取”每个间隔推出。

这是最好的方法吗?我应该开始一项任务来监视 stdout 和 stderr 吗?

4

2 回答 2

5

为了区分进程中的错误和超时,您必须管理等待的返回,这里有一个示例:

fn run() {
    let mut child = match Command::new("sleep").arg("1").spawn() {
        Ok(child) => child,
        Err(e) => fail!("failed to execute child: {}", e),
    };
    loop {
        child.set_timeout(Some(1000));
        match child.wait() {
            // Here assume any error is timeout, you can filter from IoErrorKind
            Err(..) => println!("Timeout"),
            Ok(ExitStatus(0)) => {
                println!("Finished without errors");
                return;
            }
            Ok(ExitStatus(a)) => {
                println!("Finished with error number: {}", a);
                return;
            }
            Ok(ExitSignal(a)) => {
                println!("Terminated by signal number: {}", a);
                return;
            }
        }
    }
}

关于使用流,检查 wait_with_output,或使用通道和线程实现类似的东西:http: //doc.rust-lang.org/src/std/home/rustbuild/src/rust-buildbot/slave/nightly-linux/build /src/libstd/io/process.rs.html#601

希望它有所帮助

于 2014-10-24T19:48:46.700 回答
0

看货物:

https://docs.rs/cargo-util/0.1.1/cargo_util/struct.ProcessBuilder.html#method.exec_with_streaming

唯一的缺点是,cargo-util即使openssl...default-features=false

但是您至少可以看到它read2是如何完成的。

于 2021-11-28T09:37:14.963 回答