Убийте процеса преди прекъсване на връзката

Използвам Jsch за следене на сървърен журнал. Когато затворя своя exec-канал и сесия, процесът "tail -f ..." все още остава жив от страната на сървъра.

Опитах да направя channel.sendSignal("KILL"), но хвърля изключение: com.jcraft.jsch.JSchException: failed to send channel request

как мога да направя чисто прекъсване на връзката?


person wrm    schedule 18.03.2014    source източник


Отговори (1)


Знам, че това е стара публикация, но публикувам моето решение, в случай че някой има нужда от него.

След известно тестване научих, че трябва да изпратя int стойността на сигнала вместо низа:

channel.sendSignal("2"); // CTRL + C - interrupt
channel.sendSignal("9"); // KILL

За повече сигнали превъртете до „Стандартни сигнали“ на тази страница .

Използвам следните методи за изпращане и прекъсване на команди. Те са леко модифицирани версии на примера, намерен тук.

public String sendCommand(String command)
{
  StringBuilder outputBuffer = new StringBuilder();

  try
  {
    Channel channel = sesConnection.openChannel("exec");
    ((ChannelExec)channel).setCommand(command);
    channel.connect();
    InputStream commandOutput = channel.getInputStream();

    int readByte = commandOutput.read();
    while(readByte != 0xffffffff)
    {
      outputBuffer.append((char)readByte);
      readByte = commandOutput.read();
      if (interrupt)
      {
        interruptChannel(channel);
        break;
      }
    }

    channel.disconnect();
  }
  catch(IOException ioX)
  {
    logWarning(ioX.getMessage());
    outputBuffer.append(ioX.getMessage());
    return null;
  }
  catch(JSchException jschX)
  {
    logWarning(jschX.getMessage());
    outputBuffer.append(jschX.getMessage());
  }
  finally
  {
    setInterrupt(false);
  }

  return outputBuffer.toString();
}

private void interruptChannel(Channel _channel)
{
  try
  {
    _channel.sendSignal("2");
  }
  catch (Exception e)
  {
    logger.error("Failed interrupting channel", e);
  }
}
person papkass    schedule 23.10.2014
comment
за съжаление, хвърля същото изключение. но ако това работи за вас, грешката изглежда е на моя страна... както и да е, ще затворя този въпрос. последна забележка: дори в документацията се казва да се изпраща сигнал без SIG префикс (вижте тук: epaul.github.io/jsch-documentation/simple.javadoc/com/jcraft/). - person wrm; 23.10.2014
comment
Получих изключение при изпращане на INT, но с 2 работи. Актуализирах публикацията си с методите, които използвам за изпращане на команди и сигнали. - person papkass; 23.10.2014