Убить процесс перед отключением

Я использую 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