gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:22:36 27 4
gpt4 key购买 nike

我的 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 或其他此类问题。

最佳答案

阅读manual :

On Unix, this will return None if the process was terminated by a signal; std::os::unix provides an extension trait for extracting the signal and other details from the 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()获得信号类型的 pretty-print 。

关于rust - 为什么 Command.output() 执行有时会为 status.code() 返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57047915/

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