2012-02-22 942 views
2

我想通過多線程的Java應用程序遠程執行多個命令。 我正在使用JSCH,並有問題。JSCH和多線程Java應用程序的問題

有時它運行良好,有時它只是給了我錯誤代碼'-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

你在每個線程中使用不同的JSch對象還是共享。可能會嘗試每個對象。服務器日誌中的任何信息都會每隔一段時間解釋一次-1? – Gray 2012-02-22 18:07:33

+0

當你說它返回'-1'你的意思是從'ChannelExec.getExitStatus()'? – Gray 2012-02-22 18:08:21

+0

是它的一個對象,整個發佈的代碼是在run()中調用的方法中。 -1來自Channel exitStatus。你能告訴我在服務器日誌中我應該看什麼信息嗎? – user1226447 2012-02-22 18:30:24

回答

0

在我的實驗中,如果發送到通道的命令產生文本,例如pwdECHO a,則代碼exitCode = channel.getExitStatus();將返回0。當命令沒有返回任何文本時,exitCode將返回-1,但這並不意味着它無法執行。

1

根據我的經驗,返回-1的channel.getExitStatus()意味着進程尚未完成。你確定你給這個過程足夠的時間來執行和完成?你沒有包含代碼來轉換ISIST(String),所以也許這是正確的處理事情,但萬一從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){} 
}