在断开连接之前杀死进程

时间:2014-03-18 10:25:55

标签: java jsch

我正在使用Jsch来拖尾服务器日志。当我关闭我的exec-channel和session时," tail -f ..."进程仍然在服务器端保持活跃。

我尝试channel.sendSignal("KILL")但它会引发异常: com.jcraft.jsch.JSchException: failed to send channel request

我该怎样做一个干净的断开连接?

1 个答案:

答案 0 :(得分:4)

我知道这是一个老帖子,但我发布了我的解决方案,以防有人需要它。

经过一些测试后,我了解到我必须发送信号的int值而不是字符串:

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

如需更多信号,请滚动至标准信号'在this页上。

我使用以下方法发送和中断命令。 它们是找到here的示例的略微修改版本。

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);
  }
}