Java 在Groovy中,如何在一定时间后完成或终止进程?
我试图执行一个命令,我想让进程在一定时间后(例如20分钟后)完成或终止它。这就是我迄今为止所尝试的:Java 在Groovy中,如何在一定时间后完成或终止进程?,java,groovy,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 =
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分钟后继续执行。如何修复它?Groovy提供了一个方法调用,可以用来模拟进程超时。这个方法按照它所说的去做——它等待进程在一定时间内完成,否则就破坏进程。值得一提的是,若进程由于超时而被终止,则流将被关闭,并且在尝试从中读取时,您将获得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...
希望能有帮助