为什么Command.output()执行有时会为status.code()返回{None

时间:2019-07-15 22:29:44

标签: rust

我的锈项目使用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或其他此类问题。

1 个答案:

答案 0 :(得分:5)

阅读manual

  

在Unix上,如果进程被信号终止,它将返回Nonestd::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()清晰显示信号类型。