因此,我试图执行一个Shell脚本,该脚本从Java文件中产生很多输出(以100 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/

10-11 22:38
查看更多