【问题标题】:Correct place to read and write from stdin/stderr/stdout of external process which should be terminated within timeout从外部进程的标准输入/标准错误/标准输出读取和写入的正确位置应在超时内终止
【发布时间】: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

我的问题:

  1. pb.start() 或自process.waitFor 以来是否开始2000 毫秒
  2. 当应用程序已经被杀死时从errorStream读取是否正确,或者应该放在process.destroyForcibly()之前?

【问题讨论】:

  • 需要注意的是,如果STDIN或STDERR不为空,启动的进程不会结束。这一定是在某处提到的。
  • @glee8e 你想说什么?我的应用程序正常停止
  • 在大多数情况下,进程应该因为神圣的超时而被强制终止,而不是优雅地结束。见stackoverflow.com/a/3285479/5818889

标签: java stream stdout stdin processbuilder


【解决方案1】:

2000 毫秒是否开始 sincepb.start()

没有。

或自process.waitFor()

是的。

当应用程序已经被杀死时从errorStream读取是否正确

没有。

或者应该放在process.destroyForcibly()之前?

是的。最好在单独的线程中。您还应该使用进程的stdout。否则会阻塞。

【讨论】:

  • 你能争论最后的评论吗?(为什么要在进程销毁之前读取流以及为什么要使用标准输出(我不明白为什么它可以被阻止))
猜你喜欢
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
相关资源
最近更新 更多