2011-12-07 162 views
1

您能幫我解決這個問題嗎?差異 - 通過java執行unix命令並通過提示即正常執行

我有一個Java代碼,它使用運行時對象運行rsync命令。

我在源機器上運行下面的代碼,如果在目標機器同步過程中有任何rsync連接問題,代碼應該會收到退出值,但現在不會發生。

String rsyncCommand = "rsync –abv <source> <remoteAddr:dest>" 
Runtime rt = Runtime.getRuntime(); 
rt.exec(rsyncCommand); 

給你更多的細節:

當我直接運行rsync命令(不通過java代碼)在源機器和使用kill -9同步過程中的選擇,如果我殺了在目標機器rsync的過程,源中的rsync進程將退出並退出消息。

但是,如果我通過我的java代碼運行rsync,並且如果在目標同步過程中殺死進程,它將不會收到任何退出消息。 java和rsync進程仍處於運行模式。但沒有做任何任務。

通過java直接通過命令提示符運行命令有什麼不同?

任何人都有與rsync類似的問題,我們有任何其他選項來通過Java運行rsync,我也嘗試過「ProcessBuilder」。

請給我提供一些解決此問題的指針。


感謝您的迴應,我只給出了示例代碼,下面是我在java中使用的完整代碼。

Runtime rt = Runtime.getRuntime(); 
    Process proc = null; 
    try { 
    proc = rt.exec(rsyncCommand); 
    InputStream stderr = proc.getErrorStream(); 
    InputStreamReader isrErr = new InputStreamReader(stderr); 
    BufferedReader brErr = new BufferedReader(isrErr); 

InputStream stdout = proc.getInputStream(); 
InputStreamReader isrStd = new InputStreamReader(stdout); 
BufferedReader brStd = new BufferedReader(isrStd); 

String val = null; 
while ((val = brStd.readLine()) != null) { 
    System.out.println(val); 
} 

while ((val = brErr.readLine()) != null) { 
    System.out.println(val); 
} 
int exitVal = proc.waitFor(); 
} catch (Exception e) { 
e.printStackTrace(); 

}

回答

1

你EXEC的調用()不正確,就應該直接指定參數,是這樣的:

Runtime rt = Runtime.getRuntime(); 
rt.exec(new String[]{"rsync", "-abv", "<source>", "<remoteAddr:dest>"}); 

執行不會做命令行的任何分析,所以它試圖執行一個名爲「rsync -abv」的命令(作爲單個字符串)

+0

假設源和remoteAddr和dest輸入參數,他可能要放棄功能任何';'你可以做這樣的事情:dest =「8080; rm -rf /「 – Woot4Moo

2

如果你這樣做並且進程還沒有完成,你將不會收到退出值

Process process = rt.exec(rsyncCommand); 
int exitValue = process.exitValue(); 

,而不是你應該使用

int exitValue = process.waitFor() 

然後該線程將等到返回退出值

+1

好點,我已經更新了我的答案,並且爲'waitFor()'拋出的'InterruptedException'添加了處理。 – Asaph