我正在开发java进程构建器来执行Windows外部进程(即exe文件)。我必须使用输入流、错误流来获取进程信息和错误,并将其写入一些文本文件中。
它有时工作,有时意外挂起。
当我调用大约三个外部进程来一一执行时。两个进程正在工作,并且仅在第三个进程上挂起。
我可以看到进程退出值有时为 0,它给出了一些其他随机值。
我已阅读以下博客并应用相同的逻辑来执行该流程,但不适用于我的场景。
有人可以帮我诊断这些问题吗...
//开始发起外部进程 //此代码将从中选择三个参数来顺序执行该过程 //它将把进程命令一一传递给for循环
Process p =new ProcessBuilder(s)
.directory(new File(je.getExecution().getWorkingDirectory()))
.redirectErrorStream(true)
.redirectOutput(file)
.start();
p.getOutputStream().close();
int processStatus= p.waitFor();
//如果进程以0正常终止退出
提前致谢..,
最佳答案
您所做的整个事情很容易出错,并且不值得尝试找出所有错误,因为您正在让自己的生活变得不必要的困难。
请注意,您正在调用 redirectErrorStream(true)
,但仍在尝试从错误流中读取,这是没有意义的。在这种情况下,错误流将始终为空。也就是说,如果您已经了解重定向,则不清楚为什么不直接使用它们,而是创建线程、手动将数据复制到 StringWriter 等。
显然,您想要使用工作目录je.getExecution().getWorkingDirectory()
,启动命令s
并指导输出和错误程序到文件
。这可以很容易地实现
new ProcessBuilder(s)
.directory(je.getExecution().getWorkingDirectory())
.redirectErrorStream(true).redirectOutput(file)
.start()
.waitFor();
唯一剩下的错误源是启动的进程可能会等待您这边的输入。由于您显然不想提供输入,因此可以使用
Process proc = new ProcessBuilder(s)
.directory(je.getExecution().getWorkingDirectory())
.redirectErrorStream(true).redirectOutput(file)
.start();
proc.getOutputStream().close();
proc.waitFor();
表示您不会写入任何数据。这不会停止进程,但是当它尝试从标准输入读取某些内容时,它将立即获得文件结尾而不会阻塞。
可以通过以下方式进行演示
Process proc = new ProcessBuilder("cmd", "/c", "pause")
.redirectErrorStream(true).redirectOutput(file)
.start();
proc.getOutputStream().close();
proc.waitFor();
关于java - 流程卡在流程构建器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42436307/