【问题标题】:executing kafka sh script remotely from java program从java程序远程执行kafka sh脚本
【发布时间】:2018-09-25 00:38:37
【问题描述】:

我正在尝试执行一个 kafka 脚本来检索主题、消费者组和滞后信息。我不断收到错误消息,并通过此论坛和其他论坛进行搜索,发现信息相互矛盾。有人说在 Unix 上从 Windows 执行远程脚本是不可能的,而其他人则给出了一些关于如何尝试纠正这个错误的建议。我能够连接并运行一个简单的 ping 命令并能够检索响应。也许我在这里遗漏了一个简单的被忽略的错误。

代码如下:

         try {
            jsch.setKnownHosts("C:\\Users\\.ssh\\ssh_host_rsa_key.pub");
            Session session = jsch.getSession(uname, host, 22);

            Properties config = new Properties();
            config.put("StrictHostKeyChecking", "no");

            session.setConfig(config);
            session.setPassword(pword);
            session.connect();

            Process p = Runtime.getRuntime().exec("./usr/kafka/bin/
             kafka-consumer-groups.sh --bootstrap-server 192.xxx.xx.xxx:9092 
                  --describe -group OPSII");

            InputStream scriptStdout = p.getInputStream();
            BufferedReader scriptReader= new BufferedReader(new 
                InputStreamReader(scriptStdout));
            String scriptOutput = scriptReader.readLine();
            StringBuilder sb = new StringBuilder();

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

            scriptStdout.close();

错误:

Exception in thread "main" java.io.IOException: Cannot run program 
 "./usr/kafka/bin/kafka-consumer-groups.sh": CreateProcess 
   error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)

我已经确认脚本在远程 unix 机器上运行并且目录是正确的。可能是格式吗?应该是“//”而不是“/”吗?究竟什么会导致这个错误?请这不是一个重复的问题,因为其他提议的解决方案都不起作用。

【问题讨论】:

  • 尝试使用cd 对该目录进行调试。之后尝试运行你的脚本。
  • 检查你的用户是否对目录有执行权限...
  • 当我尝试使用 cd 时,我得到以下信息:无法运行程序“cd”:....为什么 'ping www.google.com' 会起作用?
  • 删除句号。 ("/usr/kafka
  • 为什么需要远程脚本?该消费者组命令可以用 Java 编写。所有的 Kafka shell 脚本实际上都是 Java 类本身

标签: java unix apache-kafka jsch runtime.exec


【解决方案1】:

您可以使用以下代码通过JSch运行脚本

    // open a channel
    channel = session.openChannel("exec");
    // type in your command
    String command = "./path/to/your_script.sh --add_params \n";
    //Below command will execute the data you set in the previous line
    ((ChannelExec) channel).setCommand(command);
    channel.connect();

请注意,这仅使用 JSch 库。

编辑: 根据您的评论,您还想从控制台获取输出以供使用:

InputStream in = channel.getInputStream();

【讨论】:

  • 谢谢尼古拉斯。虽然这没有产生错误,但在连接语句之后我有以下内容: channel.getInputStream() 获取控制台结果但它返回 null。你能告诉我你会怎么做吗?
  • 脚本运行了吗?在channel.connect(); 之前添加此行InputStream in = channel.getInputStream(); 并尝试
猜你喜欢
  • 2019-11-12
  • 2014-07-04
  • 2012-07-25
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2016-03-15
相关资源
最近更新 更多