gpt4 book ai didi

java - 使用 Runtime.exec() 运行 perl 脚本时 BufferedReader.read() 挂起

转载 作者:行者123 更新时间:2023-12-02 04:09:35 25 4
gpt4 key购买 nike

我正在尝试从 Java 代码运行 Perl 脚本并使用以下代码读取它的输出:

String cmd = "/var/tmp/./myscript";
Process process = Runtime.getRuntime().exec(cmd);
stdin = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while((line = stdin.readLine()) != null) {
System.out.println(line);
}

但是代码总是卡在 readLine() 上。

我尝试使用

stdin.read();

相反,但这也挂起。尝试将cmd修改为

cmd = "perl /var/tmp/myscript";

还有

cmd = {"perl","/var/tmp/myscript"};

但这也悬而未决。尝试在单独的线程中读取标准输入。尝试在单独的线程中读取 stdin 和 stderr 。还是没有运气。

我知道这里有很多问题处理由于不读取流而导致的 Process.waitFor() 挂起,以及 BufferedReader.read() 挂起,尝试了所有建议的解决方案,仍然没有运气。

当然,在 CLI 本身上运行相同的脚本会将输出写入标准输出(控制台)并以退出代码 0 存在。我在 Centos 6.6 上运行。

任何帮助将不胜感激。

最佳答案

我认为,当直接从命令行运行时,脚本将运行至完成,产生预期的输出,并干净地终止。如果没有,请先修复您的脚本。

readLine() 调用挂起几乎肯定意味着既没有遇到行终止符也没有遇到文件结尾。换句话说,该方法被阻塞等待脚本。也许脚本在这种情况下根本不产生任何输出,但不会终止。例如,如果它希望在继续之前从自己的标准输入读取数据,则可能会发生这种情况。如果它的 stderr 输出被阻止,也可能会发生这种情况。

在一般情况下,您必须通过 getInputstream() 提供的 InputStream 并行读取 Process 的 stdout 及其 stderr getErrorStream()。您还应该通过向 getOutputStream() 提供所需的标准输入数据(也与读取并行)或关闭它来处理由 getOutputStream() 提供的 OutputStream。如果您正在运行的特定进程不向这些流发送数据,您可以用关闭进程的流来代替读取它们,并且您通常应该关闭进程OutputStream 当您没有更多数据时。即使您不关心从中读取的内容,您也需要读取这两个 InputStreams,因为如果不这样做,进程可能会阻塞或无法终止。做到这一点很困难,但对于特定情况来说比编写通用支持更容易。不管怎样,还有 ProcessBuilder,它在某种程度上朝着更简单的通用界面发展。

关于java - 使用 Runtime.exec() 运行 perl 脚本时 BufferedReader.read() 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33920224/

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