2010-06-17 203 views
6

我試圖從GNU/Linux平臺上的Java應用程序執行shell命令。問題是調用另一個Java應用程序的腳本永遠不會結束,儘管它從bash成功運行。我試圖調試它:從Java執行shell命令

 
(gdb) bt 
#0 0xb773d422 in __kernel_vsyscall() 
#1 0xb7709b5d in pthread_join (threadid=3063909232, thread_return=0xbf9cb678) at pthread_join.c:89 
#2 0x0804dd78 in ContinueInNewThread() 
#3 0x080497f6 in main() 

我試着用:ProcessBuilder();和Runtime.getRuntime()。exec(cmd);

看起來像是在等待某件事完成。有任何想法嗎?

感謝, Laurenţiu

+0

你是說第二個Java程序,預計很快完成,但仍外殼調用它徘徊?你確定第二個Java過程實際上已經完成(cheking進程列表)嗎? – 2010-06-17 14:21:58

+0

是的,我檢查過程列表,過程仍然存在。我想那個史密斯回答了我的問題。 – 2010-06-18 15:50:09

+0

看起來來自Java的Process類非常慢。我使用生產(非詳細)參數從shell啓動了java應用程序,並在一段時間後完成。 – 2010-06-17 14:26:31

回答

13

你處理標準輸入和標準輸出?從javadocs

由於某些本地平臺只提供用於標準輸入和輸出流有限緩衝區的大小,沒有及時寫輸入流或讀出的子過程的輸出流可能會導致子阻塞,甚至僵局。

Process cmdProc = Runtime.getRuntime().exec(command); 


BufferedReader stdoutReader = new BufferedReader(
     new InputStreamReader(cmdProc.getInputStream())); 
String line; 
while ((line = stdoutReader.readLine()) != null) { 
    // process procs standard output here 
} 

BufferedReader stderrReader = new BufferedReader(
     new InputStreamReader(cmdProc.getErrorStream())); 
while ((line = stderrReader.readLine()) != null) { 
    // process procs standard error here 
} 

int retValue = cmdProc.exitValue(); 
+0

謝謝,這解決了我的問題;-)。下次我應該更仔細地閱讀文檔。 – 2010-06-18 15:50:57