Проблемы с JSCH и многопоточным Java-приложением - PullRequest
2 голосов
/ 22 февраля 2012

Я пытаюсь выполнить несколько команд удаленно через многопоточное приложение Java. Я использую JSCH для этого и у меня есть проблема с этим.

Иногда он работает нормально, а иногда выдает мне код ошибки «-1» и ничего не регистрирует. Я не могу понять, почему он не работает, потому что он ничего не регистрирует, когда возвращает «-1». Ниже приведен код:

JSch jsch = new JSch();  
Session session;
int exitCode = 0;
try {
    String cmd = "command";
    session = jsch.getSession("usrName", "machineName");        
    session.setConfig("StrictHostKeyChecking", "no");
    session.setPassword("pwd");
    session.connect(500);
    Channel channel = session.openChannel("exec");
    ChannelExec channelExec = (ChannelExec) channel;
    channelExec.setCommand("cmd.exe /c "+cmd);
    channel.connect();          
    InputStream is = channel.getInputStream();
    log.info(convertISToString(is));
    exitCode = channel.getExitStatus();
    System.out.println(exitCode);
    channel.disconnect();
    session.disconnect();       
} catch (JSchException e) {
    log.info(e)
    return 1;
} catch (IOException e) {
    log.info(e);
    return 1;
}
return exitCode;

Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 27 июля 2012

По моему опыту, channel.getExitStatus (), возвращающий -1, означает, что процесс еще не завершен.Вы уверены, что даете процессу достаточно времени для выполнения и завершения?Вы не включили код для convertISToString (is), так что, возможно, он обрабатывает вещи правильно, но, на всякий случай, из примера JSch Exec.java, один из способов ожидания его правильного завершения и получения кода выхода состоит в том, чтобы сделать что-токак:

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){}
}
0 голосов
/ 27 июля 2012

В моем эксперименте код exitCode = channel.getExitStatus(); вернет 0, если команда, отправленная на канал, выдаст в результате текст, такой как pwd или ECHO a. Если команда не возвращает никакого текста, exitCode вернет -1, но это не значит, что ее не удалось выполнить.

...