gpt4 book ai didi

rust - 如何定时查询子进程状态

转载 作者:行者123 更新时间:2023-11-29 08:18:54 26 4
gpt4 key购买 nike

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

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

有一个夜间功能称为 try_wait它可以满足我的要求,但我真的不认为我应该为此每晚运行 Rust!

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

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

最佳答案

目前,如果您不想使用夜间 channel ,可以使用一个名为 wait-timeout 的箱子(感谢@lukas-kalbertodt 的建议)将 wait_timeout 函数添加到 std::process::Child特质。

可以这样使用:

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 try_wait() , 代码看起来几乎相同(所以一旦它进入发布分支,假设没有进一步的变化,应该很容易移动到那个),但它会阻塞给定的 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);
}

关于rust - 如何定时查询子进程状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43705010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com