JSCH和多线程Java应用程序的问题

时间:2012-02-22 17:14:05

标签: java multithreading jsch

我试图通过多线程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 个答案:

答案 0 :(得分:1)

根据我的经验,channel.getExitStatus()返回-1表示该进程尚未完成。你确定你给这个过程足够的时间来执行和完成吗?你没有包含转换为MQString(是)的代码,所以也许正确处理事情但是,以防万一,从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){}
}

答案 1 :(得分:0)

在我的实验中,如果发送到频道的命令产生文本,代码exitCode = channel.getExitStatus();将返回0,例如pwdECHO a。当命令没有返回任何文本时,exitCode将返回-1,但这并不意味着它无法执行。