从java调用shell脚本挂起

pav*_*imo 1 java shell

所以我正在尝试执行一个shell脚本,它从Java文件中产生大量输出(以100s为单位).这会挂起进程并永远不会完成.

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

是因为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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

脚本'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
Run Code Online (Sandbox Code Playgroud)

免费啤酒的正确答案.:)

And*_*yle 5

这是因为你没有从Process'输出中读取.

根据类'Javadocs,如果你不这样做,那么你可能会陷入僵局; 进程填充其IO缓冲区并等待"shell"(或侦听进程)从中读取并清空它.与此同时,您的进程应该这样做,阻止等待进程退出.

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

另外,请看看五个Java进程陷阱Runtime.exec()不会 - 两篇关于常见问题的信息性文章Process.