从java程序运行bash脚本时出现奇怪的行为

Rom*_*las 1 java linux process

我有一个脚本(准确地说是KSH脚本),它使用curl命令从FTP服务器下载3个文件.

当我手动运行我的脚本时,即通过执行命令./ftp_download.sh XXX(XXX是脚本的参数),下载正确完成.

因为我想从Java程序运行脚本,所以我创建了一个简短的Java类,其中包含以下内容:

public class Run {

    private static final String CMD = "/.../sh/ftp_download.sh XXX";

    public static void main(String[] args) {
        System.out.println("========================================================");
        BufferedReader out = null;
        try {
            long startTime = System.currentTimeMillis();
            String strOutputline;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date now = new Date();
            Process processus = Runtime.getRuntime().exec(CMD);
            out = new BufferedReader(new InputStreamReader(processus.getInputStream()));
            while ((strOutputline = out.readLine()) != null) {
                now.setTime(System.currentTimeMillis());
                System.out.println(sdf.format(now) + " " + strOutputline);
            }
            System.out.println("RESULT : " + processus.waitFor());
            out.close();
            processus.destroy();
            long duration = System.currentTimeMillis() - startTime;
            System.out.println("Duration : " + duration);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        System.out.println("========================================================");
        System.out.println("END");
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这个简单的程序时,它只是在3m20之后冻结(这个持续时间始终是相同的,即使我多次运行Java程序).通过冻结,我的意思是Java程序仍在运行(curl过程也是如此),但下载的文件不再增长(即curl不继续下载任何数据)...

因此,我从来没有RESULT: xxx在控制台中打印过这条线......

什么可以解释这种奇怪的行为?

ps:在不久的将来,我将更改我的项目,以便使用Apache commons-net库下载这些文件,但我真的想了解这种奇怪的行为!


感谢德罗伯特,我终于设法解决了这个问题.一些解释:在正常模式下,curl显示进度信息(包含下载数据量的表,剩余时间等).过了一段时间,缓冲区似乎完全填满了,这就是为什么这个过程冻结......

der*_*ert 13

我不是一个Java人,而是一个Unix人,有一件事显而易见:stdout或stderr上的缓冲区正在填满,然后curl阻塞.

如果你在静默模式下运行curl,它是否有效curl --silent

检查Java文档,getErrorStream除了getInputStream之外,您还希望使用它.