我有一个使用curl
命令从FTP服务器下载3个文件的脚本(准确的说是KSH脚本)。从java程序运行bash脚本时出现奇怪的行为
当我手动运行我的脚本,即通过执行命令./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");
}
}
然而,当我运行这个简单的程序,它只是正好3m20后冻结(这个持续时间总是相同的,即使我多次运行Java程序)。我的意思是Java程序仍在运行(curl
过程),但下载的文件不再增长(即curl
不会继续下载任何数据)...
因此,我从来没有得到RESULT: xxx
行打印在控制台上...
什么能解释这种奇怪的行为?
PS:在不远的将来,我会改变我的项目,以便使用Apache公地网库下载这些文件,但我真的想了解这种奇怪的行为!
由于derobert,我终于设法解决这个问题。一些解释:在正常模式下,curl
正在显示一个进度信息(一个表格包含下载的数据量,剩余时间等)。过了一段时间,缓冲区似乎完全填满了,这就是为什么这个过程冻结的原因...
你可以尝试strace在java进程,看看它的等待/挂起。 – vpram86 2009-09-22 14:08:56
伙计,从java程序运行bash脚本* IS *一个奇怪的行为:)抱歉,无法抗拒... – 2009-09-22 14:29:47