[英]piping hot java — some strange behavior when processing stdin with java from bash
[英]Strange behavior when running a bash script from java program
我有一個腳本(准確地說是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");
}
}
但是,當我運行這個簡單的程序時,它只會在3m20之后凍結(即使我多次運行Java程序,此持續時間也總是一樣)。 凍結是指Java程序仍在運行( curl
進程也是如此),但下載的文件不再增長(即curl
不會繼續下載任何數據)...
因此,我永遠不會在控制台上打印RESULT: xxx
行。
有什么可以解釋這種奇怪的行為?
ps:在不久的將來,我將更改項目,以便使用Apache commons-net庫下載這些文件,但是我真的很想了解這種奇怪的行為!
多虧了derobert ,我終於設法解決了這個問題。 一些解釋:在正常模式下, curl
顯示進度信息(包含下載數據量,剩余時間等的表)。 一段時間后,緩沖區似乎已完全填滿,這就是進程凍結的原因...
我不是Java的人,而是Unix的人,這似乎很明顯:stdout或stderr上的緩沖區已裝滿,然后curl被阻塞。
如果您以無聲模式(例如curl --silent
運行curl,是否可以正常工作?
檢查Java文檔,您似乎除了getInputStream之外還希望使用getErrorStream
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.