Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;尾部-f“;JSch连接关闭后,进程将不会退出_Java_Ssh_Jsch - Fatal编程技术网

Java &引用;尾部-f“;JSch连接关闭后,进程将不会退出

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

我使用JSch跟踪远程计算机中的文件。但我发现在程序退出后, “tail-f”进程仍然存在于远程计算机中。 如果我删除“-f”参数,一切正常

我尝试使用“sendSignal()”,但它不起作用。这个函数似乎不是由OpenSSH实现的

下面是测试代码

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()前面的行中

这应该给你想要的行为