Jsch命令执行挂断了Docker日志

时间:2019-04-04 10:29:44

标签: docker jsch

我正在使用JSch在远程计算机上执行命令,如下所示:

public String executeCommandNWaitForCompletion(String hostIp, String userName, String password, String command) throws Exception {
    Session session = null;
    ChannelExec channel = null;
    InputStream in = null;
    String response = "";
    try {
        session = getSession(hostIp, userName, password);
        channel = (ChannelExec) session.openChannel("exec");
        channel.setCommand(command);
        channel.setInputStream(null);
        channel.setErrStream(System.err);
        in = channel.getInputStream();
        channel.connect();
        byte[] tmp = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(tmp, 0, 1024);
                if (i < 0) break;
                response += new String(tmp, 0, i);
            }
            if (channel.isClosed()) {
                if (in.available() > 0) continue;
                log.debug("Exit-status: " + channel.getExitStatus());
                break;
            }
        }

    } finally {
        if (in != null) in.close();
        closeResources(session, channel);
    }
    return response;
}

在tomcat docker容器中,此方法是从spring mvc控制器调用的。整个应用程序运行良好,但是调用此方法时,docker容器日志将被挂起,此后未显示任何内容。但是应用程序照常运行,只有日志被挂起。

当我们直接在Tomcat服务器上运行应用程序但在Docker容器中不起作用时,此方法运行良好。

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

我已删除代码中的以下两行来解决此问题:

channel.setInputStream(null);
channel.setErrStream(System.err);