【发布时间】:2017-08-25 11:07:02
【问题描述】:
我有通过进程构建器启动外部进程的 java 应用程序。
外部应用程序通过stdin,stdout,stderr 与其他“世界”交互。此外,此过程的执行时间不应超过某个超时时间。
代码如下:
ProcessBuilder pb = new ProcessBuilder(parameters);
Process process = pb.start();
OutputStream processOutputStream = process.getOutputStream();
IOUtils.write(inputJson, processOutputStream); // write data to external process
processOutputStream.close(); we don't need pass more arguments
InputStream errorStream = process.getErrorStream();
boolean responseWithinTimeout = process.waitFor(2000, TimeUnit.MILLISECONDS); //app should work not longer than 2 sec
if (process.isAlive()) {
process.destroyForcibly();
}
String stringFromErrorStream = IOUtils.toString(errorStream, "UTF-8"); //read from external application error stream
我的问题:
- 自
pb.start()或自process.waitFor以来是否开始2000 毫秒 - 当应用程序已经被杀死时从
errorStream读取是否正确,或者应该放在process.destroyForcibly()之前?
【问题讨论】:
-
需要注意的是,如果STDIN或STDERR不为空,启动的进程不会结束。这一定是在某处提到的。
-
@glee8e 你想说什么?我的应用程序正常停止
-
在大多数情况下,进程应该因为神圣的超时而被强制终止,而不是优雅地结束。见stackoverflow.com/a/3285479/5818889
标签: java stream stdout stdin processbuilder