2013-09-26 99 views
0

我試圖在自己的控制檯窗口中運行plink。我開始使用Process.exec(),並且工作正常。我轉向使用ProcessBuilder,現在輸出不會發出,直到我終止進程。使用進程生成器重定向進程輸出

我的代碼如下所示:

class ConsoleOutputThread extends Thread { 

    public void start(String processName) { 
     // this was old code: Runtime r = Runtime.getRuntime(); 
     try { 
      builder = new ProcessBuilder("plink", "-ssh", "192.168.3.21"); 
      builder.redirectErrorStream(true); 
      process = builder.start(); 
      //this was old code: process = r.exec (processName); 
     } catch (IOException ex) { 
     } 
     start(); 
    } 

    @Override 
    public void run() { 
     try { 
      BufferedReader is = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
      try { 
       process.waitFor(); 
      } catch (InterruptedException ex) { 
      } 
      char b[]; 
      b = new char[1]; 
      while(is.read(b, 0, 1)> 0) { 
       // this is for debug, normally sent to console 
       System.out.println("Got character: " + b[0]); 
      } 
     } catch (IOException ex) { 
     } 
    } 
} 

因此,在使用的Runtime.exec()時,一切運行良好。現在,使用ProcessBuilder,讀取功能會永遠阻止(實際上,直到我終止進程時,當進程被拋出時)。但是,錯誤流的作用,即如果我把一個錯誤的選項,我得到的消息在控制檯。 我可能在這裏錯過了一些東西並尋求幫助。 謝謝

+0

你是否flush()你的流? –

+1

可能重複的[Process.waitFor(),線程和InputStreams](http://stackoverflow.com/questions/2150723/process-waitfor-threads-and-inputstreams) – jtahlborn

+0

顯然waitFor()會產生問題,程序掛在那裏。沒有它,它的工作 –

回答

0

你已經設置plink進程將其輸出寫到連接到Java進程的管道。 plink進程輸出的任何內容都將保存在操作系統緩衝區中,直到進程讀取它爲止。 OS緩衝區的容量有限,如果plink寫入太多數據,則它將阻塞,直到您的進程從緩衝區讀取一些數據。

不幸的是,java進程在從管道讀取任何內容之前等待plink進程完成。因此,如果plink進程寫入太多的輸出,它將無限期地阻塞。

在調用waitfor()之前,您應該更改java邏輯以讀取plink進程的輸出。

+0

你是正確的,但plink不會發送太多的輸出,但它等待另一個進程完成(ssh)。它要求輸入密碼,直到它連接並驗證後,它才保留在waitFor()中。所以,如果我註釋掉waitFor(),它會繼續。然而,ssh(「[email protected]'s password:」)的輸出沒有進入我的輸入流,它從我開始jar文件的地方進入控制檯(這在Linux中,在Windows中我認爲plink實現不同)。所以問題變成了'如何重定向一個調用另一個進程的進程的輸出?' –

相關問題