2014-10-16 4 views
1

У меня есть приложение с двумя кнопками для запуска и остановки выполнения команды JSch. Так что я следующий метод, который вызывает, когда мы нажали на кнопку пуска:Выполнение команды прерывания JSch

public String executeSSHCommand(String pattern, String listFiles) {    
    searchRez = new StringBuilder();   
    BufferedReader br = null; 
    String line, cmd = null; 
    // adding ' symbol to pattern 
    pattern = "'"+pattern+"'";  
    // 
    try { 
     Channel channel = session.openChannel("exec");    
     cmd = "zgrep " + pattern + " " + listFiles; 
     log.debug("Executing next ssh command: " + cmd);       
     ((ChannelExec)channel).setCommand(cmd);       
     channel.setInputStream(null); 
     ((ChannelExec)channel).setErrStream(System.err);    
     InputStream in=channel.getInputStream(); 
     channel.connect(); 
     // read server output 
     br = new BufferedReader(new InputStreamReader(in)); 
     while(true && !isCancel){    
      while ((line = br.readLine()) != null && !isCancel) {       
      searchRez.append(line+"\n");       
      }       
      if(channel.isClosed()){ 
       log.debug("Exit status for execute ssh command is " + channel.getExitStatus());     
      break; 
      } 
      try{Thread.sleep(1000);}catch(Exception ee){log.error(ee);} 
     } 

     if (isCancel) { 
      log.debug("Search was canceled by user... ");     

      channel.setInputStream(null);     
      if (in != null) { 
       in.close(); 
       in = null; 
      } 
      if (br != null) { 
       br.close(); 
       br = null; 
      } 
      try{Thread.sleep(1000);}catch(Exception ee){log.error(ee);} 
     } 
     // 
     channel.disconnect(); 
     session.disconnect();   
     log.debug("Search pattern in log file is complete."); 
    } catch (Exception ex) { 
     log.error(ex); 
    }    
    log.debug("Rezult string has next value: " + searchRez.toString()); 
    return searchRez.toString(); 
} 

Как вы можете видеть выше, мы имеем isCancel переменной, это логическое летучий переменная, мы задаем ложным, когда нажмите на кнопку остановки. Поэтому моя проблема заключается в том, когда пользователь нажимает кнопку остановки и канал с сеансами отключается, zgrep выражение продолжает работу на сервере. Я думал, что channel.disconnect() должен остановить все мои запущенные команды на сервере, может кто-нибудь, пожалуйста, сообщите, как исправить это. Благодарю.

ответ

2

@dic19 дал мне идею послать Ctrl+C команды на сервер перед тем отключением канала и сессии для того, чтобы прервать zgrep выполнения команды на стороне сервера.

Я нашел this post в списке рассылки JSch, который помог мне решить мою проблему.

Так отправить Ctrl+C команды, необходимо включить режим замазки для объекта канала ((ChannelExec)channel).setPty(true); и написать 3 значение для канала OutputStream:

 ((ChannelExec)channel).setPty(true); 
     ((ChannelExec)channel).setCommand(cmd);       
     channel.setInputStream(null); 
     ((ChannelExec)channel).setErrStream(System.err);    
     InputStream in=channel.getInputStream(); 
     OutputStream out = channel.getOutputStream(); 
     channel.connect(); 
     ........... 
     if (isCancel) { 
      log.debug("Search was canceled by user... ");     

      channel.setInputStream(null);     
      if (in != null) { 
       in.close(); 
       in = null; 
      } 
      if (br != null) { 
       br.close(); 
       br = null; 
      } 
      out.write(3); 
      out.flush(); 
      try{Thread.sleep(1000);}catch(Exception ee){log.error(ee);} 
     } 
+2

+1 Но, пожалуйста, добавьте код, который решить вашу проблему, поэтому в случае связь отбросил ваш ответ по-прежнему. Кроме того, будущим посетителям не придется искать внешние источники, чтобы найти ответ. – dic19

Смежные вопросы