Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Groovy中,如何在一定时间后完成或终止进程?_Java_Groovy - Fatal编程技术网

Java 在Groovy中,如何在一定时间后完成或终止进程?

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 =

我试图执行一个命令,我想让进程在一定时间后(例如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分钟后继续执行。如何修复它?

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... 
希望能有帮助