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

JSCH和多线程java应用程序的问题,java,multithreading,jsch,Java,Multithreading,Jsch,我试图通过多线程java应用程序远程执行多个命令。 我正在使用JSCH来解决这个问题 有时它运行正常,有时它只给我错误代码'-1',不记录任何内容。我无法找出它失败的原因,因为它返回“-1”时没有记录任何内容。代码如下: JSch jsch = new JSch(); Session session; int exitCode = 0; try { String cmd = "command"; session = jsch.getSession("usrName", "ma

我试图通过多线程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;

非常感谢您的帮助。

在我的实验中,代码
exitCode=channel.getExitStatus()pwd
ECHO a
,则code>将返回0。当命令不返回任何文本时,
exitCode
将返回-1,但这并不意味着它无法执行。

根据我的经验,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){}
}
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);

如果(i)您在每个线程或共享中使用不同的
JSch
对象。可能会尝试每个对象使用一个。服务器日志中的任何信息每隔一段时间解释一次-1?当您说它返回
-1
时,您的意思是从
ChannelExec.getExitStatus()返回
?是的,每个对象一个,整个发布的代码都在从run()调用的方法中.-1来自通道exitStatus。您能告诉我我应该在服务器日志中的什么位置查找信息吗?我会查看sshd的系统日志输出,看看您是否看到了什么。这取决于sshd是如何配置的。是否确实完成了该过程?Channel.getExitStatus()如果进程未实际完成,将返回-1。