gpt4 book ai didi

java - 从 java 调用 shell 脚本挂起

转载 作者:行者123 更新时间:2023-11-29 06:46:57 25 4
gpt4 key购买 nike

因此,我正在尝试执行一个 shell 脚本,该脚本会从 Java 文件中生成大量输出(数百 MB)。这会挂起进程并且永远不会完成。

但是,在 shell 脚本中,如果我将脚本的输出重定向到某个日志文件或/dev/null,Java 文件会立即执行并完成。

是因为 Java 程序永远无法完成的数据量大吗?如果是这样,是否有任何此类文件?还是对数据量(记录)有任何限制?

下面是模拟此场景的方法。

Java 文件看起来像:

import java.io.InputStream;

public class LotOfOutput {

public static void main(String[] args) {
String cmd = "sh a-script-which-outputs-huuggee-data.sh";
try {
ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
pb.redirectErrorStream(true);
Process shell = pb.start();
InputStream shellIn = shell.getInputStream();
int shellExitStatus = shell.waitFor();
System.out.println(shellExitStatus);
shellIn.close();
} catch (Exception ignoreMe) {
}
}
}

脚本“a-script-which-outputs-huuggee-data.sh”可能如下所示:

#!/bin/sh
# Toggle the line below
exec 3>&1 > /dev/null 2>&1

count=1
while [ $count -le 1000 ]
do
cat some-big-file
((count++))
done

echo
echo Yes I m done

答对了就免费喝啤酒。 :)

最佳答案

这是因为您没有从 Process 的输出中读取。

根据 class' Javadocs ,如果你不这样做,那么你可能会陷入僵局;该进程填充其 IO 缓冲区并等待“shell”(或监听进程)从中读取并清空它。与此同时,本应执行此操作的进程正在阻塞等待进程退出。

您需要调用 getInputStream()并从中可靠地读取(可能从另一个线程)以停止进程阻塞。

另请查看 Five Java Process PitfallsWhen Runtime.exec() Won't - 两篇关于 Process 常见问题的信息性文章。

关于java - 从 java 调用 shell 脚本挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3425754/

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