运行超时的命令



我正在将一个命令行程序从Python转换为Rust。

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

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

例如:

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机箱,它将这种复杂性封装在一个简单的函数后面。

最新更新