我正在将一个命令行程序从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
机箱,它将这种复杂性封装在一个简单的函数后面。