2011-08-03 46 views
1

我使用Apache的百科全書Exec和嘗試啓動子,將應用程序的整個持續時間工作。它應該啓動進程,接受兩個輸入命令,並保持在後臺。現在它只接受一個命令(至少是什麼stdout顯示)並終止。你能幫助我嗎?試圖運行子只會打印標準輸出,然後終止

CommandLine cmdLine = new CommandLine("app.exe"); 
cmdLine.addArgument("argument"); 
DefaultExecutor executor = new DefaultExecutor(); 
OutputStream os = new ByteArrayOutputStream(); 
InputStream is = new ByteArrayInputStream(("command1;\ncommand2;\n").getBytes()); 
executor.setStreamHandler(new PumpStreamHandler(os,null,is)); 
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); 
executor.execute(cmdLine,resultHandler); 
System.out.println(os.toString()); 
resultHandler.waitFor(); 

回答

1

我覺得這兩條線都是以錯誤的順序:

System.out.println(os.toString()); 
    resultHandler.waitFor(); 

應該是這樣(允許進程來完成它的輸出):

resultHandler.waitFor(); 
    System.out.println(os.toString()); 

編輯

仍然不是100%確定你在做什麼,但認爲我錯過了原始請求中的「僅停留在後臺」部分。達到此目的的一種方法是使用一對來與流程對話。完成後,您可以關閉輸出流。如果您希望在過程完成之前訪問過程的輸出,則可以使用類似的方法反轉輸出。

我沒有Windows機器方便,但下面的工作對我來說:

public static void main(String[] args) { 
    try { 
     CommandLine cmdLine = new CommandLine("/bin/bash"); 
     DefaultExecutor executor = new DefaultExecutor(); 
     OutputStream os = new ByteArrayOutputStream(); 
     PipedOutputStream pos = new PipedOutputStream(); 
     PipedInputStream pis = new PipedInputStream(pos); 
     executor.setStreamHandler(new PumpStreamHandler(os, null, pis)); 
     DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); 
     executor.execute(cmdLine, resultHandler); 

     PrintWriter pw = new PrintWriter(pos); 
     pw.println("ls -l /usr"); 
     pw.println("pwd"); 
     pw.close(); 
     resultHandler.waitFor(); 
     System.out.println(os.toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

我想你沒有理解我。 IT打印** command1 **,然後終止。甚至沒有等待輸入。 – mihn

相關問題