Java &引用;尾部-f“;JSch连接关闭后,进程将不会退出
我使用JSch跟踪远程计算机中的文件。但我发现在程序退出后, “tail-f”进程仍然存在于远程计算机中。 如果我删除“-f”参数,一切正常 我尝试使用“sendSignal()”,但它不起作用。这个函数似乎不是由OpenSSH实现的 下面是测试代码Java &引用;尾部-f“;JSch连接关闭后,进程将不会退出,java,ssh,jsch,Java,Ssh,Jsch,我使用JSch跟踪远程计算机中的文件。但我发现在程序退出后, “tail-f”进程仍然存在于远程计算机中。 如果我删除“-f”参数,一切正常 我尝试使用“sendSignal()”,但它不起作用。这个函数似乎不是由OpenSSH实现的 下面是测试代码 public static void main(String[] args) throws Exception { String usr = args[0]; String host = args[1]; String pa
public static void main(String[] args) throws Exception {
String usr = args[0];
String host = args[1];
String password = args[2];
JSch jsch = new JSch();
Session session = jsch.getSession(usr, host);
String pwd = password;
session.setPassword(pwd);
Hashtable<String, String> config = new Hashtable<String, String>();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(15000);
session.setServerAliveInterval(15000);
ChannelExec m_channelExec = (ChannelExec) session.openChannel("exec");
String cmd = "tail -f /var/log/messages";
m_channelExec.setCommand(cmd);
InputStream m_in = m_channelExec.getInputStream();
m_channelExec.connect();
BufferedReader m_bufferedReader = new BufferedReader(new InputStreamReader(m_in));
int i = 0;
while (++i < 10) {
if (m_bufferedReader.ready()) {
String line = m_bufferedReader.readLine();
System.out.println(line);
}
Thread.sleep(1000);
}
m_bufferedReader.close();
m_channelExec.sendSignal("SIGINT");
m_channelExec.disconnect();
session.disconnect();
System.out.println("exit");
}
publicstaticvoidmain(字符串[]args)引发异常{
字符串usr=args[0];
字符串host=args[1];
字符串密码=args[2];
JSch JSch=新的JSch();
Session Session=jsch.getSession(usr,host);
字符串pwd=密码;
会话设置密码(pwd);
Hashtable config=新的Hashtable();
配置放置(“检查”、“否”);
session.setConfig(config);
会话连接(15000);
session.setServerAliveInterval(15000);
ChannelExec m_ChannelExec=(ChannelExec)session.openChannel(“exec”);
String cmd=“tail-f/var/log/messages”;
m_channelExec.setCommand(cmd);
InputStream m_in=m_channelExec.getInputStream();
m_channelExec.connect();
BufferedReader m_BufferedReader=新的BufferedReader(新的InputStreamReader(m_in));
int i=0;
而(++i<10){
if(m_bufferedReader.ready()){
String line=m_bufferedReader.readLine();
系统输出打印项次(行);
}
睡眠(1000);
}
m_bufferedReader.close();
m_channelExec.sendSignal(“SIGINT”);
m_channelExec.disconnect();
session.disconnect();
System.out.println(“退出”);
}
有什么解决方案可以解决这个问题吗?一个execCommand不向通道分配一个控制tty,因此tail实际上是在向管道写入。它将继续,直到更多的数据被发送到它(它将得到一个SIGPIPE) 最简单的解决方案是分配tty-使用:
m_channelExec.setPty(true);
在m_channelExec.connect()前面的行中代码>
这应该给你想要的行为