当前位置: 代码迷 >> 综合 >> jsch shell等待指令返回结果时阻塞
  详细解决方案

jsch shell等待指令返回结果时阻塞

热度:24   发布时间:2024-02-05 05:33:06.0

情况一

while((buff=in.readLine())!=null){//in是BufferedReader,字符流System.out.println(buff);
}

代码这样写时,能输出结果,但输出完成后依旧在等待对方返回信息。

情况二

System.out.println("in.available="+in.available());
while(in.available()>0){//in是InputStream字节流int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));
}

这样写的输出有问题,执行结果是上一条指令的执行结果,第一条指令没有输出。
在这里插入图片描述

原因

刚把指令传输给Linux,就立即执行读结果操作导致的。指令可能还在执行或者还在传输的过程中,就读取结果肯定是读不出来的。

解决方法

一、休眠几秒再读

Thread.sleep(1000);
System.out.println("in.available="+in.available());
while(in.available()>0){int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));
}

在这里插入图片描述
结果就正常了。

二、
如果之前的代码是这样写的,导致读完结果还是阻塞

while(true){while(in.available()>0){int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));}if(openChannel.isClosed()){if(in.available()>0){continue;}System.out.println("exit-status"+openChannel.getExitStatus());break;}
}

设置个超时时间,超时就跳出循环

long startTime = System.currentTimeMillis();
while(true){while(in.available()>0){int len=in.read(buf,0,buf.length);if(len<0){break;}sb.append(new String(buf,0,len));}if(openChannel.isClosed()){if(in.available()>0){continue;}System.out.println("exit-status"+openChannel.getExitStatus());break;}long endTime = System.currentTimeMillis();if(endTime-startTime>TIMEOUT) {break;}Thread.sleep(500);
}