2017-09-15 135 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