Aleatoriamente recebendo saída vazia durante a execução do comando shell via JSch

Eu estou tentando executar abaixo do comando Linux via JSch (comando de verificação de espaço) usando o JSch:

df -h -P |awk '{print $6" "$4}' |awk '{ if ($1 == "/On_Demand") {print}}' | awk '{print $2}' | awk '{ if ($1 ~ /M/) {print ($1*1)} else if($1 ~ /G/) {print ($1*1024)} else if($1 ~ /T/) {print ($1*1024*1024)} else if($1==0) {print ($1*1)} else if($1 ~ /K/) {print ($1/1024)} else {print ("-1")}}' 

Comando de backup:

 export ORACLE_HOME=/path/to/ora/home;export ORACLE_SID=sid;/U01/NEW_DEMO/path/to/ora/home/bin/expdp username/password directory=ON_DEMAND schemas=xyz dumpfile=expdp_xyz.dmp logfile=xyz.log;tail -n 1 /On_Demand/xyz.log 

Código para ler a saída:

 public String getOutput() { LOGGER.debug("[getOutput]"); StringBuffer output = new StringBuffer(); InputStream in = null; if (channel != null && channel.isConnected()) { try { in = channel.getInputStream(); byte[] tmp = new byte[1024]; while (true) { while (in.available() > 0) { int i = in.read(tmp, 0, 1024); if (i < 0) break; output.append(new String(tmp, 0, i)); } if (channel.isClosed()) { LOGGER.debug("[getOutput] Channel is closed, so breaking while loop with exit code: "+channel.getExitStatus()); break; } } } catch (IOException e) { LOGGER.error(e.toString()); e.printStackTrace(); } finally { channel.disconnect(); } } else { System.out.println("Channel is disconnected"); } return output.toString(); } 

A questão é, quando eu tento ler a saída do comando, muitas vezes eu recebo o espaço livre, mas às vezes não consigo saída.
Quando a class SSH é chamada novamente (como 2 ou 3 vezes, onde em uma nova session é estabelecida) para triggersr o mesmo comando, recebo a saída (o que é estranho).

O mesmo problema está ocorrendo em outra funcionalidade na qual eu disparei um comando para fazer backup de um esquema Oracle e quando tento ler o arquivo de log gerado pelo Oracle (os comandos backup e tail são triggersdos de uma vez, separados por dois pontos), sem saída, mas o arquivo de log está lá. Várias tentativas de triggersr o mesmo comando de backup me dão saída.

Este é um problema enorme que ocorre na minha ferramenta desde um mês.

Qualquer ajuda sobre isso será apreciada.

Desde já, obrigado.

Eu acredito que você tem uma condição de corrida no seu código.

Se o comando conseguir produzir uma saída e sair, entre os in.available() e in.available() , você perderá a saída.

Veja como o exemplo oficial Exec.java re-testa o in.available() novamente no bloco in.available() .

 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()){ if(in.available()>0) continue; System.out.println("exit-status: "+channel.getExitStatus()); break; } try{Thread.sleep(1000);}catch(Exception ee){} }