运行 一条超时命令

Running a command with timeout

我正在将命令行程序从 Python 翻译成 Rust。

程序必须 运行 无法终止的不同命令。

Python 版本使用 subprocess.run() 接受 timeout 作为参数。

例如:

result = subprocess.run(["java", "MyProgram"],
                        timeout=timeout,
                        capture_output=True)

翻译成 Rust 时,我使用:

let out = Command::new("java")
    .arg("MyProgram")
    .output()?;

但据我所知,Command 不允许我指定任何超时。

因为它会在 GNU/Linux 上 运行,我可以简单地用 timeout 包装调用(如 timeout 10 java MyProgram),但我想知道是否有任何解决方案不依赖于 timeout.

所以问题是:如何 运行 来自 Rust 的超时命令?

有几种方法可以解决这个问题。

一种方法是启动后台线程并使用 Child::kill() 在超时后终止进程。您需要使用 Arc 在线程之间共享对象。这有点问题,因为 Child 的方法需要对 Child 的可变引用,因此您不能在尝试从一个线程中杀死它的同时等待来自一个线程的进程另一个。

另一种方法是在自旋循环中使用 Child::try_wait() 并在挂钟超过阈值时间时终止进程。

或者,考虑使用 wait_timeout crate,它将这种复杂性隐藏在一个简单的函数之后。