0

我正在创建 jsch 会话以远程运行命令,但我正面临一种奇怪的行为。在我的一个线程中,我创建会话,将输出流设置为 System.err 并使用会话。

ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setErrStream(System.err);

在另一个线程中,我有一些使用 Java util 记录器的东西(默认情况下将日志写入 System.err)。创建 jsch 会话后,我不再在第二个线程的控制台中看到记录器消息。当我删除这一行时:

channel.setErrStream(System.err);

或将通道的错误流设置为空,来自我的第二个线程的记录器消息出现在控制台中就好了。

如果 jsch session 在设置时拥有 System.err 流,这就是 logger 无法使用的原因,那么当 session 的错误流设置为 null 时会发生什么?如果不是这种情况,那么为什么在会话开始使用 System.err 后没有出现记录器消息?

如果有人可以解释这一点,那将非常有用。

4

1 回答 1

0

您可以在此处找到 Jsch javadoc 的在线副本。本页文件ChannelExec。的单参数版本的setErrStream()描述是这样说的(强调添加):

公共无效 setErrStream(输出流输出)

设置错误流。远程进程的标准错误输出将被发送到该流。流将在 Channel.disconnect(com.jcraft.jsch.Session) 上关闭

换句话说,将 System.err 传递给这个函数会导致 Jsch 在断开通道时关闭它。一旦 System.err 关闭,程序的其他部分(例如记录器)将无法写入 System.err。

该文档描述了另一个版本,setErrorStream()它有两个参数:

public void setErrStream(OutputStream out, boolean dontclose)

设置错误流。远程进程的标准错误输出将被发送到该流。

参数:

dontclose - 如果为真,我们不会关闭 Channel.disconnect(com.jcraft.jsch.Session) 上的流。

换句话说,这个版本的函数让您可以控制在断开通道时是否应该关闭错误流。

于 2016-03-06T18:28:06.657 回答