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之外,您还希望使用它.