如何定期查询子进程状态

时间:2017-04-30 09:40:28

标签: rust

我使用Rust的Command API生成了一个子进程。

现在,我需要在继续之前观察此过程几秒钟,因为该过程可能会提前死亡。成功之后,它应该“永远”运行,所以我不能等待。

有一个名为try_wait的夜间功能可以完成我想要的功能,但我真的不认为我应该为此每晚运行Rust!

我想我可以启动一个新线程并让它永远等待或直到进程终止......但我不想用该线程挂起我的进程,所以也许运行线程作为守护进程可能是一个解决方案。 ..

这是要走的路还是有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

目前,如果您不想使用夜间频道,则会有一个名为wait-timeout的箱子(感谢@ lukas-kalbertodt提供建议),将wait_timeout功能添加到{{ 3}}特质。

可以像这样使用:

let cmd = Command::new("my_command")
    .spawn();

match cmd {
    Ok(mut child) => {
        let timeout = Duration::from_secs(1);

        match child.wait_timeout(timeout) {
            Ok(Some(status)) => println!("Exited with status {}", status),
            Ok(None) => println!("timeout, process is still alive"),
            Err(e) => println!("Error waiting: {}", e),
        }
    }
    Err(err) => println!("Process did not even start: {}", err);
}

要继续监视子进程,只需将其包装成循环。

请注意,使用Rust的nightly std::process::Child,代码看起来几乎相同(所以一旦进入发布分支,假设没有进一步的更改,它应该很容易移动到那个),但它会阻止对于给定的timeout,即使进程早于此死亡,与上述解决方案不同:

let cmd = Command::new("my_command")
    .spawn();

match cmd {
    Ok(mut child) => {
        let timeout = Duration::from_secs(1);
        sleep(timeout); // try_wait will not block, so we need to wait here
        match child.try_wait() {
            Ok(Some(status)) => println!("Exited with status {}", status),
            Ok(None) => println!("timeout, process is still alive"),
            Err(e) => println!("Error waiting: {}", e),
        }
    }
    Err(err) => println!("Process did not even start: {}", err);
}