2017-09-15 134 views
0

我試圖在Java中的遠程服務器上執行的四個命令。由於命令涉及出口,我已經鏈接在一起他們進入一個命令:Java和SSH導致掛起

rm -f nohup.out && export <a few similar commands> && nohup #here I execute a 
startup script#>nohup.out >nohup.out 2>nohup.err </dev/null & 

那麼我想等一會(大約30秒),並從分析nohup.out的IP地址。我遇到的問題是程序掛起並且似乎沒有斷開連接 - 調試代碼指示它在下面的代碼塊中的某處斷開,因爲它實際上成功地執行了命令服務器端

如何我是否成功關閉連接?

發送代碼,它使用JSch和來自在此網站的upvoted溶液如下。在這之後有一條調試線路,它永遠不會到達。

((ChannelExec)channel).setCommand(command); 
    InputStream commandOutput = channel.getInputStream(); 
    channel.connect(); 
    int readByte = commandOutput.read(); 

    while(readByte != 0xffffffff) 
    //while (true) 
    { 
     outputBuffer.append((char)readByte); 
     readByte = commandOutput.read(); 
    } 
+0

你需要什麼的'nohup'和'&'呢? –

+0

服務器端腳本我跑吐出了很多東西,我不在乎 - 我只關心一個行包含一個IP地址。坦率地說,我對ssh知之甚少,因此我可能根本不需要nohup。我的想法是,它會抑制輸出,並允許java程序關閉而不會終止服務器端程序。我用錯了嗎? –

+0

我能想到的不nohup的另一種選擇將是連續監測服務器輸出,直至IP地址顯示出來 –

回答

0

我有類似的問題,與其他類型的流我正在讀(例如WebSockets的)的。大多數情況下,這是關於read()阻塞並且不能很好地阻止中斷。如果是這種情況,你可能需要強制關閉通道或開關到非阻塞狀態(可能使用available()或類似的東西)。

的甚至更好,而不是做輪詢讀取,你可以指定你想要的輸出流。

這裏有一個工作示例:

 executor = (ChannelExec) session.openChannel("exec"); 
     executor.setPty(true); 
     executor.setCommand(script); 
     executor.setOutputStream(output); 
     executor.setErrStream(error); 
     executor.connect(); 
     int errorStatus = -1; 

     for (int i = 0; !executor.isClosed(); i++) { 
      if (i > 0) { 
       long delayMs = (long) (200L * Math.pow(i, 2)); 
       Thread.sleep(delayMs); 
      } 
      if ((errorStatus = executor.getExitStatus()) != -1) { 
       break; 
      } 
     } 
     LOGGER.debug("Output: {}", output.toString()); 
     LOGGER.debug("Error: {}", error.toString()); 
+0

在這裏,輸出和錯誤流是我希望的任何閱讀流? –

+0

是的,唯一的區別就是你的方法,你在你的腳步/輪詢閱讀,同時與建議代碼的輸出將被寫入緩衝區。 – iocanel