【发布时间】:2020-10-17 04:00:57
【问题描述】:
我想执行一个命令,然后将任何潜在的输出捕获到 stderr。这是我所拥有的:
if let Ok(ref mut child) = Command::new("ssh")
.args(&[
"some_args",
"more_args"
])
.stderr(Stdio::piped())
.spawn()
{
let output = child.wait().expect("ssh command not running");
let reader = BufReader::new(child.stderr.take().expect("failed to capture stderr"));
for line in reader.lines() {
match line {
Ok(line_str) => println!("output: {}", line_str);
Err(e) => println!("output failed!"),
}
}
}
我看到正在打印输出,但程序随后挂起。我怀疑这可能与子进程退出和 BufReader 无法读取 eof 有关。一种解决方法是维护let mut num_lines = 0;,然后在每次读取时增加它。在 x 次读取后,我中断了 for 循环,但这似乎不是很干净。如何让 BufReader 正确完成阅读?
【问题讨论】:
-
您可以验证您的 ssh 命令是否退出?它对任何其他命令执行此操作吗?有很多错误输出吗?它实际上挂在
reader.lines()或child.wait()上吗?我看到了一些陷阱,但我想确保我正在解决正确的问题 -
实际上再读一遍,我不确定是否理解症状。如果等待孩子完成,那么出售的蒸汽将被关闭,并且 lines() 不应该挂起......如果可能的话,请解释一下制作一个 MCVE。
-
您是否正在执行远程命令并注销参数?因为这是完全有可能的,如果不是,您只是拨打另一台计算机并且永远不会结束会话。
标签: rust