我的锈项目使用Command
执行一个过程。
有时(低频)运行此代码时,对status.code()
的调用将返回None。我通常使用的是Mac OS Catalina Beta 1,rustc 1.36.0-但它也发生在Travis中(必须去那里找到OS / rustc的日志)。
我将其视为错误,但是“随机”会导致本地构建和travis构建失败,所以现在我忽略了它-但很高兴了解导致它的原因。
在失败的情况下,立即重新运行将使其成功。
let output = Command::new(&command)
.args(command_args)
.stdin(Stdio::inherit())
.stdout(Stdio::inherit())
.stderr(Stdio::piped())
.output()
.chain_err(|| "Error while attempting to spawn command to compile and run flow")?;
match output.status.code() {
Some(0) => Ok("Flow ran to completion".to_string()),
Some(code) => {
error!(
"Process STDERR:\n{}",
String::from_utf8_lossy(&output.stderr)
);
bail!("Exited with status code: {}", code)
}
None => Ok("No return code - ignoring".to_string()),
}
我的问题不是这种可能发生的原因(我知道文档说“被信号终止”),而是为什么它 发生了,因为没有一个AFAIK发送信号给我,我非常怀疑任何OOM或其他此类问题。
答案 0 :(得分:5)
阅读manual:
在Unix上,如果进程被信号终止,它将返回
None
;std::os::unix
提供了扩展特征,用于从ExitStatus
中提取信号和其他细节。
use std::os::unix::process::ExitStatusExt;
use std::process::Command;
fn main() {
let mut child = Command::new("sleep")
.args(&["10"])
.spawn()
.expect("failed to spawn child");
child.kill().expect("failed to kill on child");
let status = child.wait().expect("failed to wait on child");
match status.code() {
None => {
println!("{:?}", status.signal());
()
}
_ => (),
}
}
您可以使用from_c_int()
清晰显示信号类型。