如何在Groovy中经过一段时间后完成或终止进程?

时间:2018-06-08 22:54:43

标签: java groovy

我正在尝试执行一个命令,我想在一段时间后(例如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分钟后继续执行。我该如何解决?

1 个答案:

答案 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... 

希望它有所帮助。