我正在使用Jsch来拖尾服务器日志。当我关闭我的exec-channel和session时," tail -f ..."进程仍然在服务器端保持活跃。
我尝试channel.sendSignal("KILL")
但它会引发异常:
com.jcraft.jsch.JSchException: failed to send channel request
我该怎样做一个干净的断开连接?
答案 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);
}
}