如何在不杀死派生命令的情况下运行外部命令并退出失控程序



现在我正试图创建一个运行vlc的程序,然后退出rust程序。

以下是我目前的实现:

use anyhow::{Context, Result};
fn play_vlc(music_path: &str, vlc_args: &[&str]) -> Result<()> {
let vlc_process = process::Command::new("vlc")
.current_dir(music_path)
.args(vlc_args)
.output() 
.with_context(|| "Error trying to play music")?;
std::process::exit(0);
Ok(())
}

这很好,但由于vlc是一个连续的过程,它永远不会到达std::process::exit(0),因此程序一直在运行。

我尝试了.spawn()而不是.output(),它允许用户手动关闭rust进程,并且仍然运行vlc进程。但我希望锈蚀过程自动关闭,现在有一堆来自vlc的输出。

文档真的很好。阅读它们。您所说的所有内容都是预期行为:.output()等待子进程完成。.spawn()允许命令在保留为默认值时继承stdin、stdout和stderr。这意味着,vlc上的stdout将与Rust进程中的stdout相同。如果你的流程可以println!一些东西,那么vlc也可以,它会去同一个地方。

现在该如何绕过它?从本质上讲,您将希望做与>/dev/null在您的shell中所做的相同的事情。.stdout(…)允许配置stdout发生的情况,如果您想将其重定向到任何位置:

.stdout(process::Stdio::null())
.stderr(process::Stdio::null())
.spawn()

看到这是std提供的,我有点惊讶,我预计这需要一些依赖于平台的操作。你真幸运。

相关内容

最新更新