Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 程序在试图终止进程时挂起,直到最终终止_Java_Watchdog_Apache Commons Exec - Fatal编程技术网

Java 程序在试图终止进程时挂起,直到最终终止

Java 程序在试图终止进程时挂起,直到最终终止,java,watchdog,apache-commons-exec,Java,Watchdog,Apache Commons Exec,我正在修复一个导致CI/CD管道故障的bug。在集成测试期间,我们启动一个本地数据库实例。为了做到这一点,我们使用一些mariadb包装器从java代码库启动它 这个过程可能(可能)需要很长时间才能完成,这将导致我们的测试超时。在本例中,我们添加了一个功能,可以在进程无法在20秒内安装并应重试时终止该进程 这部分似乎起作用了 当试图破坏过程时,会出现奇怪的情况。似乎随机需要约2-3分钟才能解锁。这是有问题的,原因与上述问题有问题的原因相同 通过对底层库的调查,我们似乎正在使用ExecuteWat

我正在修复一个导致CI/CD管道故障的bug。在集成测试期间,我们启动一个本地数据库实例。为了做到这一点,我们使用一些mariadb包装器从java代码库启动它

这个过程可能(可能)需要很长时间才能完成,这将导致我们的测试超时。在本例中,我们添加了一个功能,可以在进程无法在20秒内安装并应重试时终止该进程

这部分似乎起作用了

当试图破坏过程时,会出现奇怪的情况。似乎随机需要约2-3分钟才能解锁。这是有问题的,原因与上述问题有问题的原因相同

通过对底层库的调查,我们似乎正在使用ExecuteWatchdog来管理流程。阻塞的代码位是:

watchDog.destroyProcess();
// this part usually returns nearly instantly

try {
  // this part can take minutes...
  resultHandler.waitFor();
} catch (InterruptedException e) {
  throw handleInterruptedException(e);
}
除此之外,Mac/Linux上还有不同的行为。如果我执行类似于
resultHandler.waitFor(1000)//在退出之前等待1000ms超时的操作,它在macbook上可以正常工作,但在linux上我会看到类似这样的错误:
java.io.FileNotFoundException:{{executable}(文本文件繁忙)

有什么想法吗

我做了一些研究,它看起来像是看门狗。destroyProcess是发送一个SIGTERM而不是SIGKILL。但是我没有任何钩子来获取
进程
对象,以便将KILL发送给它


谢谢。

处理进程时阻塞的一个常见原因是,进程在输出到stdout或(更容易被忽略的)stderr时被阻塞

在此上下文中,在CI服务器上设置测试时,可以尝试将和输出设置为


请注意,这意味着您将无法读取Java代码中的子进程输出或错误流。我的假设是,您无论如何都不会尝试这样做,这就是进程挂起的原因。相反,该输出将被重定向到Java进程的输出,我希望您的CI服务器将其记录为构建的一部分。

处理进程时阻塞的一个常见原因是进程在输出时被阻塞,无论是到标准输出还是(更可能被忽略的)标准输出

在此上下文中,在CI服务器上设置测试时,可以尝试将和输出设置为

请注意,这意味着您将无法读取Java代码中的子进程输出或错误流。我的假设是,您无论如何都不会尝试这样做,这就是进程挂起的原因。相反,该输出将被重定向到Java进程的输出,我希望您的CI服务器将其作为构建的一部分进行记录