JSCH和多线程java应用程序的问题
我试图通过多线程java应用程序远程执行多个命令。 我正在使用JSCH来解决这个问题 有时它运行正常,有时它只给我错误代码'-1',不记录任何内容。我无法找出它失败的原因,因为它返回“-1”时没有记录任何内容。代码如下: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
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。