2013-07-16 74 views
3

我有一個Java應用程序調用tcsh腳本,該腳本又調用同一目錄中的perl腳本。如果我通過鍵入「runPerlScript.sh」從命令運行此腳本,它將完全正常工作,並且應該會生成幾個輸出文件。但是,如果我從Java調用腳本,使用下面的代碼:即使輸出重定向,Java進程也會提前停止

String[] runCmd = {"/bin/tcsh","-c","/filepath/runPerlScript.sh"}; 
    Process run = Runtime.getRuntime().exec(runCmd); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(run.getInputStream())); 

    String line = ""; 
    line = reader.readLine(); 
    System.out.println("\nStarting while."); 
    while((line)!=null){ 
     System.out.println("Output from script: "+line); 
     line=reader.readLine(); 
    } 
    reader.close(); 
    System.out.println("Finished running perl script."); 

它打印出從我的shell腳本回聲陳述我的控制檯(我使用NetBeans),但只生成4個輸出文件(通常情況下它會產生近50)。看起來好像該進程正在退出,因爲在生成這4個文件之後,我的shell腳本中的一條回顯語句顯示「Finished running runPerlScript.sh」輸出到我的控制檯。我嘗試了幾種不同的方法來運行這個腳本,包括ProcessBuilder,但似乎沒有生成輸出文件。上面的代碼實際上是我能夠生成任何輸出的唯一方式,因爲ProcessBuilder只是導致了hangups。有誰知道我可以如何不斷讓腳本運行?

回答

1

從的Runtime.exec()的Javadoc:

「執行在一個單獨過程中的指定的字符串命令」。

假設你要等待進程結束時,你將需要等待的過程中你的主要的Java線程終止。執行此操作的最佳方法是監視ProcessBuilder.start()返回的Process,然後等待Process.waitFor()。

+0

即使使用Process.waitFor()方法,生成的輸出仍然沒有變化。它仍然只有4個文件,Java認爲它已經完成。 –

+0

您是否嘗試過直接運行腳本而不是調用tcsh(假設您的shebang行狀態爲#!/ bin/tcsh)。 –

+0

是的,仍然只產生4個文件:( –

相關問題