我试图通过多线程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;
感谢任何帮助。
答案 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,例如pwd
或ECHO a
。当命令没有返回任何文本时,exitCode
将返回-1,但这并不意味着它无法执行。