我正在尝试执行一个命令,我想在一段时间后(例如20分钟后)完成或终止该过程。这是我到目前为止所尝试的:
def proc =["/bin/sh", "-c","command"].execute()
proc.waitFor(1200, TimeUnit.SECONDS)
StringBuffer outputStream = new StringBuffer()
proc.waitForProcessOutput(outputStream, System.err)
String output = outputStream.toString()
即使我设置了proc.waitFor(1200, TimeUnit.SECONDS)
,该过程也不会停止,并且会在超时20分钟后继续执行。我该如何解决?
答案 0 :(得分:1)
Groovy提供了一个方法调用Process.waitForOrKill(long numberOfMillis)
,您可以使用它来模拟进程的超时。这种方法实现了它所说的 - 它等待过程在一定时间内完成,否则会破坏过程。值得一提的是,如果进程因超时而被终止,则流已关闭,并且在尝试从中读取时将获得IOException
(包括检查流是否可用于proc.inputStream.available()
)。这就是为什么在try-catch中运行这样的代码很重要。
请考虑以下示例:
import java.time.LocalTime
try {
println "[${LocalTime.now()}] Start..."
def proc = ["/bin/sh", "-c", "sleep 5s && echo 'test'"].execute()
proc.waitForOrKill(2 * 1000)
def output = proc.text?.trim()
println "[${LocalTime.now()}] Output = ${output}"
} catch (IOException e) {
System.err.println("[${LocalTime.now()}] Process killed before completing!")
} finally {
println "[${LocalTime.now()}] End..."
}
这是一个非常简单的过程,睡眠时间为5秒,并向控制台回应“测试”。在这个例子中,我给这个过程完成了2秒钟,这导致这个过程在完成之前失败:
[08:30:04.116] Start...
[08:30:06.198] Process killed before completing!
[08:30:06.214] End...
但是如果我将超时增加到10秒钟,那么该过程在大约5秒后成功完成:
[08:30:39.582] Start...
[08:30:44.655] Output = test
[08:30:44.656] End...
希望它有所帮助。