2016-05-30 3 views
1

Мне нужно получить сообщение об ошибке при запуске любой команды с помощью JSch.Как обнаружить ошибку (как в «Справочном не найдена», «Слушатель TNS потерял контакт» и т. Д.) В JSch?

В настоящее время я использую код ниже, чтобы получить вывод команды tail, но если файл не существует, я должен получить ошибку как вывод (который я не получаю).

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) { 
       LOGGER.debug("[getOutput] in while"); 
       while (in.available() > 0) { 
        LOGGER.debug(in.available()); 
        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"); 
        break; 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      channel.disconnect(); 
     } 
    } else { 
     System.out.println("Channel is disconnected"); 
    } 

    return output.toString(); 
} 

Есть ли способ получить сообщение об ошибке?

Заранее благодарен.

ответ

1

Ошибка, как правило, записывается на выход ошибки. Вы можете прочитать вывод ошибки с использованием getErrStream.

Обратите внимание, что вам необходимо прочитать стандартный вывод (getInputStream) и выход ошибки параллельно, а не в последовательности. Я имею в виду, что вы не можете просто клонировать свою петлю while, у вас есть для getInputStream, для getErrStream. Вы должны иметь один цикл, считая с обоих (прочитайте, что доступно в одном, прочитайте, что доступно во втором, дождитесь появления новых данных и повторите)

Когда вы читаете первый, а затем другой, если последний вывод большой, его выходной буфер заполняется, команда останавливается, а не заканчивается. Поэтому, если вы продолжаете ждать завершения первого вывода, вы зашли в тупик с сервером.


Обратите внимание, что «Ошибка аутентификации» не ошибка, выводимый командой. Это исключение, вызванное библиотекой JSch. Так что это не относится к вашему коду.

+0

Что вы подразумеваете, прочитав параллельно? –

+0

Я имею в виду, что вы не можете просто дублировать цикл 'while', который у вас есть для' getInputStream' для 'getErrStream'. Вам нужно иметь один цикл, читающий с обоих (чтение того, что доступно в одном, чтение того, что доступно во втором, ожидание новых данных и повторение). –

+0

Прохладный, спасибо за ваш ответ :) –

0

Если у вас есть ChannelExec для вызова удаленной команды, вы можете использовать channel.getExitStatus(), чтобы получить (не нулевой) числовой код exec в ситуации сбоя (при условии, что команда и команда, которые вы используете, хорошо себя ведут).