首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`exec.Command()`在运行` `kcat`‘时不产生输出

`exec.Command()`在运行` `kcat`‘时不产生输出
EN

Stack Overflow用户
提问于 2021-12-31 14:30:27
回答 2查看 183关注 0票数 0

为了读取一系列主题消息,我需要将kcat封装在Go函数中,因此考虑使用exec.Command()来实现如下所示:

代码语言:javascript
复制
package main

import (
    "fmt"
    "os/exec"
)

func main() {

    cmd := exec.Command("kcat", "-b kafka.kafka.svc.cluster.local:9092", "-t messages", "-o 11000", "-c 11333")

    fmt.Println("Command String:", cmd.String())

    out, err := cmd.CombinedOutput()

    if err != nil {
        fmt.Println("Error Accessing kafka topic messages ", err.Error(), string(out))
        return
    }

    fmt.Println("Result Length:", len(out))

    fmt.Println("Result Content:", string(out))

}

但是,这只返回kcat输出的第一行:

代码语言:javascript
复制
/app/tools # ./five
Command String: /usr/bin/kcat -b kafka.kafka.svc.cluster.local:9092 -t messages -o 11000 -c 11333
Result Length: 58

Result Content: % Auto-selecting Producer mode (use -P or -C to override)

(注意:我是在码头集装箱中运行的,但我不认为这有什么区别)

但是,当直接从CLI运行时,这是很好的:

代码语言:javascript
复制
/app/tools # 
/app/tools # kcat -b kafka.kafka.svc.cluster.local:9092 -t messages -o 10 -c 15
% Auto-selecting Consumer mode (use -P or -C to override)
%4|1640957136.462|OFFSET|rdkafka#consumer-1| [thrd:main]: messages [1]: offset reset (at offset 10) to END: fetch failed due to requested offset not available on the broker: Broker: Offset out of range
%4|1640957136.483|OFFSET|rdkafka#consumer-1| [thrd:main]: messages [2]: offset reset (at offset 10) to END: fetch failed due to requested offset not available on the broker: Broker: Offset out of range
[{"Name":"newOrder", "ID":"9266","Time":"9266","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"1547","Time":"1547","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"9179","Time":"9179","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"8740","Time":"8740","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"9318","Time":"9318","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"1743","Time":"1743","Data":"new order", "Eventname":"newOrder"}]

kcat命令似乎有一些独特之处,它破坏了Go中的exec.Command()

问题:

在围棋中,还有其他方法可以达到同样的效果吗?exec.Command(),,

理想情况下,我可以在本例中使用kcat命令,因为我希望避免在这个实例中使用segmentios kafka-go库。

编辑

分隔参数(如@onecricketeer):所建议的)的

代码语言:javascript
复制
cmd := exec.Command("kcat", "-b", "kafka.kafka.svc.cluster.local:9092", "-t", "messages", "-o", "11000", "-c", "11333")

结果(同样的错误):

代码语言:javascript
复制
/app/tools # ./code
Command String: /usr/bin/kcat -b kafka.kafka.svc.cluster.local:9092 -t messages -o 11000 -c 11333
Result Length: 58
Result Content: % Auto-selecting Producer mode (use -P or -C to override)

  • 使用BASH作为shell (由maxm建议):

同样的结果,即只报告kcat输出的第一行:

代码语言:javascript
复制
/app/tools # ./code
Command String: /bin/bash -c kcat -b kafka.kafka.svc.cluster.local:9092 -t messages -o 11000 -c 11333
Result Length: 58
Result Content: % Auto-selecting Producer mode (use -P or -C to override)

编辑

注意:但是,当我使用Python的shell执行机制时,它工作得很好,这让我想知道Gos的shell处理特性是否有缺陷:

代码语言:javascript
复制
import subprocess

process = subprocess.Popen(["kcat","-b","kafka.kafka.svc.cluster.local:9092","-t","messages","-o","1", "-c", "11"], 
                           stdout=subprocess.PIPE,
                           universal_newlines=True)

while True:
    output = process.stdout.readline()
    print(output.strip())
    # Do something else
    return_code = process.poll()
    if return_code is not None:
        print('RETURN CODE', return_code)
        # Process has finished, read rest of the output 
        for output in process.stdout.readlines():
            print(output.strip())
        break

结果:

代码语言:javascript
复制
/app/tools/python # python3 code.py 
% Auto-selecting Consumer mode (use -P or -C to override)
%4|1641004616.232|OFFSET|rdkafka#consumer-1| [thrd:main]: messages [2]: offset reset (at offset 1) to END: fetch failed due to requested offset not available on the broker: Broker: Offset out of range
%4|1641004616.236|OFFSET|rdkafka#consumer-1| [thrd:main]: messages [1]: offset reset (at offset 1) to END: fetch failed due to requested offset not available on the broker: Broker: Offset out of range
[{"Name":"newOrder", "ID":"4512","Time":"4512","Data":"new order", "Eventname":"newOrder"}]

RETURN CODE 0
[{"Name":"newOrder", "ID":"2388","Time":"2388","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"8707","Time":"8707","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"1643","Time":"1643","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"2421","Time":"2421","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"7520","Time":"7520","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"1258","Time":"1258","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"1457","Time":"1457","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"2907","Time":"2907","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"9266","Time":"9266","Data":"new order", "Eventname":"newOrder"}]

[{"Name":"newOrder", "ID":"1547","Time":"1547","Data":"new order", "Eventname":"newOrder"}]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-01 13:22:41

如输出所示,正在自动选择生产者模式。

尝试使用带分隔参数的使用者模式。

代码语言:javascript
复制
cmd := exec.Command("kcat", "-C", "-b", "kafka.kafka.svc.cluster.local:9092", "-t", "messages", "-o", "11000", "-c", "11333")
票数 1
EN

Stack Overflow用户

发布于 2021-12-31 15:54:09

go命令:

代码语言:javascript
复制
cmd := exec.Command("kcat", "-b kafka.kafka.svc.cluster.local:9092", "-t messages", "-o 11000", "-c 11333")

与shell命令相同:

代码语言:javascript
复制
kcat "-b kafka.kafka.svc.cluster.local:9092" "-t messages" "-o 11000" "-c 11333"

在默认情况下,您需要分隔参数,就像shell在每个空格上为您所做的一样:

代码语言:javascript
复制
cmd := exec.Command("kcat", "-b", "kafka.kafka.svc.cluster.local:9092", "-t", "messages", "-o", "11000", "-c", "11333")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70543222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档