Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSch->读取“长”输出不会停止_Java_Jsch - Fatal编程技术网

Java JSch->读取“长”输出不会停止

Java JSch->读取“长”输出不会停止,java,jsch,Java,Jsch,我试图在远程机器上使用JSch执行一些shell命令。然而,当该命令像ls一样快速运行和返回时,我的方法会返回,但当该命令需要一段时间才能运行,并产生大量输出时,比如servicemyservice stop;service myservice start,其中service是我需要重新启动的一些服务的名称,我的方法陷入外部whiletrue循环,我不知道为什么 事实证明,这不是执行远程命令的时间,而是其他时间。我在另一端用一个python脚本尝试了这个方法,该脚本只写了10分钟的垃圾,并且正常

我试图在远程机器上使用JSch执行一些shell命令。然而,当该命令像ls一样快速运行和返回时,我的方法会返回,但当该命令需要一段时间才能运行,并产生大量输出时,比如servicemyservice stop;service myservice start,其中service是我需要重新启动的一些服务的名称,我的方法陷入外部whiletrue循环,我不知道为什么

事实证明,这不是执行远程命令的时间,而是其他时间。我在另一端用一个python脚本尝试了这个方法,该脚本只写了10分钟的垃圾,并且正常返回

代码如下:

我还尝试使用.isEOF检查远程输出是否已完成,但这也不起作用

我目前的想法是使用一些sentinel,例如,要运行的命令的MD5来确定远程端是否已完成,即运行命令+;echo\+md5command+\,但这感觉不太对


有人能帮我吗?

对所有可能追随我脚步的人说:我最终使用了库而不是JSch。该库中的方法似乎更符合逻辑,而且一切都正常。至少,我没有遇到JSch的问题

我总是使用分离线程读取JSch的输出和错误流。如果通道在超时情况下关闭,您的代码就没有机会访问。我想到了这一点,这将是我的下一步。但目前似乎没有任何内容写入错误流,因为它被重定向到System.err,并且那里没有任何内容……这正是问题所在,当连接断开时,任何内容都不会进入错误流和输出流,并且您的代码将永远等待:但我该如何做呢?我添加了InputStream stderr=ChannelExec channel.getErrStream;然后我会在每次进去后检查里面是否有可用的东西。。循环,但它总是空的。@lbolit很抱歉延迟,我现在没有Jsch的示例,但我可以向您指出Ganymed-ssh2中的示例。请看。stout由StreamGobler包装,StreamGobler在不同的线程中消耗stout,重要的是,在不同的线程中检查通道是否关闭。我希望它能澄清如何解决你的问题。话虽如此,我认为切换到Ganymed实际上是一个好主意: private String execCommand(String command) throws JSchException, IOException { Channel channel = session.openChannel("exec"); ((ChannelExec) channel).setCommand(command); channel.setInputStream(null); ((ChannelExec) channel).setErrStream(System.err); InputStream in = channel.getInputStream(); channel.connect(); byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; System.out.print(new String(tmp, 0, i)); } if (channel.isClosed()) { System.out.println("exit-status: " + channel.getExitStatus()); break; } try { Thread.sleep(1000); } catch (Exception ee) { } } channel.disconnect(); return new String(tmp,Charset.forName("UTF-8")); }