gpt4 book ai didi

java - "tail -f"JSch连接关闭后进程不会退出

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:20:36 28 4
gpt4 key购买 nike

我使用 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");
}

有什么办法可以解决这个问题吗?

最佳答案

execCommand 不会为 channel 分配控制 tty,因此 tail 实际上是在写入管道。它会继续,直到有更多数据发送给它(它会得到一个 SIGPIPE)。

最简单的解决方案是分配一个 tty - 使用:

m_channelExec.setPty(true);

m_channelExec.connect(); 之前的行

这应该会给你想要的行为。

关于java - "tail -f"JSch连接关闭后进程不会退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32024651/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com