gpt4 book ai didi

java - 卡在流程生成器上的流程

转载 作者:行者123 更新时间:2023-12-03 12:59:33 24 4
gpt4 key购买 nike

我正在使用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,并将程序的输出和错误都定向到file。这可以轻松实现

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com