用jsch session和channelexec执行多个命令

时间:2018-09-26 17:03:26

标签: java unix apache-kafka jsch

我很难使它正常工作,但最终让脚本在远程的UNIX服务器上执行命令(执行sh脚本)。我正在尝试执行第二条命令,并在创建新频道或使用新频道时不断出现错误。

       try {


            ((ChannelExec) channel).setCommand(command);
            PrintStream out= new PrintStream(channel.getOutputStream());
            InputStream in = channel.getInputStream();

            channel.connect();

            BufferedReader scriptReader= new BufferedReader(new InputStreamReader(in));
            scriptOutput = scriptReader.readLine();

            sb = new StringBuilder();

            while ((scriptOutput = scriptReader.readLine())!= null) {
                sb.append(scriptOutput + "\n");

这是通道执行的第一个代码片段,可以正常工作。现在,在使用了上述输入流之后,将立即调用下一个方法片段:

      try {

          StringBuilder sb = new StringBuilder();
          command = new_command;
          ((ChannelExec) channel).setCommand(command);

          InputStream in = channel.getInputStream();
          channel.connect();
          BufferedReader scriptReader= new BufferedReader(new InputStreamReader(in));
          scriptOutput = scriptReader.readLine();

            //StringBuilder sb = new StringBuilder();
          for(int c=0; c < consumerList.size(); c++){
           ....

现在这将返回以下错误:

com.jcraft.jsch.JSchException: channel is not opened.

现在,如果我创建一个具有相同会话的新频道,则会从返回的流中得到空响应。我确实在远程外壳中测试了该命令,并且效果很好:

      int counter = 0;
      Channel channelII = session.openChannel("exec");

      try {

          StringBuilder sb = new StringBuilder();
          command = new_command;
          ((ChannelExec) channelII).setCommand(command);

          InputStream in = channelII.getInputStream();
          channelII.connect();
          BufferedReader scriptReader= new BufferedReader(
           new InputStreamReader(in));
          scriptOutput = scriptReader.readLine();

第二条命令如下,我希望能够针对不同的消费者群体重复执行它:

/usr/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 
    192.xxx.xx.xxx:9092 --describe -group consumergroup1

编辑:

第二条命令的响应:

TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  
   LAG        CONSUMER-ID                                       HOST                           
  CLIENT-ID
   output.influxDB    1          94919           2781796         
    2686877    -                                                 -                              
   -
   output.influxDB    0          94919           2781798         
    2686879    -                                                 -                              
   -
   output.influxDB    2          94918           2781795         
    2686877    -                                                 -                              
    -

1 个答案:

答案 0 :(得分:0)

感谢尼古拉斯和马丁的回应。我发现了问题所在,并想发布一个答案,因为我意识到这样的小事情确实会使我们那些“愚蠢”的程序员冒出来,他们提出了引起否决票数的荒谬问题。第二个命令的输出在第一行中返回警告/错误响应,并且由于不包括以下内容,因此我没有看到该内容,并且读取下一行为空。我知道这很愚蠢,应该在发布之前就弄清楚了,因为那是本网站的重点:发布超出他人知识范围的问题。但由于我本来应该知道这一点:

无论如何,请确保包括以下行:

  ((ChannelExec)channelII).setErrStream(System.err);

并循环读取流,而不仅仅是读取第一行进行测试。

     while ((scriptOutput = scriptReader.readLine())!= null) {
                sb.append(scriptOutput + "\n");
          }

我希望这至少对某些人来说是一个教训,即使不是解决方案。