0

JavaからサーバーにSSHで接続し、複数のコマンドを実行しようとしています。コマンドは正常に機能しているように見えますが、Javaで希望する結果が返されません。

これが私のコードスニペットです

        final Command cmd = session.exec("cd /app/t/backo/bin && ls -all && pwd && . setDBLApp && sudo -E -u deploy ./runDBLApp && sudo -E -u deploy ./nightlyDBL -type host ");

        System.out.println(IOUtils.readFully(cmd.getInputStream()).toString());
        cmd.join(30, TimeUnit.SECONDS);
        System.out.println("\n** exit status: " + cmd.getExitStatus());

これが私が出力のために見るものです。LocalWindowのサイズ設定と関係があると思いますが、修正方法がわかりません。これは、画面出力が多いsshコマンドを使用した場合にのみ発生します(または発生するようです)。

これは、100行ほどの小さなスニペットです。

14:56:48.957 [reader] INFO  n.s.s.c.c.direct.SessionChannel - Received window adjustment for 2097152 bytes
14:56:48.957 [reader] DEBUG n.s.s.c.channel.Window$Remote - Increasing by 2097152 up to 2097152
14:56:48.957 [reader] DEBUG net.schmizz.concurrent.Promise - Setting <<chan#0 / chanreq for exec>> to `SOME`
14:56:48.963 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 4096 down to 2093056
14:56:48.964 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 1002 down to 2092054
14:56:48.964 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 23 down to 2092031
14:56:49.090 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 141 down to 2091890
14:56:49.120 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 267 down to 2091623
14:56:49.230 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 309 down to 2091314
14:56:49.531 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 308 down to 2091006
14:56:49.532 [reader] DEBUG n.s.s.c.channel.Window$Local - Consuming by 306 down to 2090700

私が見たいのは、冗長である可能性のあるsshコマンドからの画面出力です。

4

1 に答える 1

0

これはおそらくウィンドウのサイズ設定に関係しているとあなたは考えています。サーバーからの出力を保持するローカルウィンドウsshjは、いっぱいになっている可能性があります。デフォルトのルールでは、APIによって提供されるstdout / stderrストリーム、つまりchannel.getInputStream()/から読み取ることによってバッファーにスペースを作成するときに、それが拡張されます。channel.getErrorStream()

2つのオプションがあります。

  • コマンドの実行中は、stdoutストリームとstderrストリームを排出し続けます。スニペットに基づいて、実際にはstdoutから読み取っていますが、stderrからは読み取っていません。available()実装されているonのメソッドを使用して、2つのストリームからの読み取りを多重化できますjava.io.InputStream

  • 設定sessionChannel.setAutoExpand(true)しますが、これは、生成される出力の量に関係なく、stdout / stderrストリームを読み取ってドレインしていなくても、ローカルウィンドウが拡張し続けることを意味することに注意してください。したがって、これは高いメモリ消費を引き起こす可能性があります。

于 2012-06-18T15:35:07.373 に答える