我使用Rust的Command API生成了一个子进程。
现在,我需要在继续之前观察此过程几秒钟,因为该过程可能会提前死亡。成功之后,它应该“永远”运行,所以我不能等待。
有一个名为try_wait的夜间功能可以完成我想要的功能,但我真的不认为我应该为此每晚运行Rust!
我想我可以启动一个新线程并让它永远等待或直到进程终止......但我不想用该线程挂起我的进程,所以也许运行线程作为守护进程可能是一个解决方案。 ..
这是要走的路还是有更好的解决方案?
答案 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);
}