运行 `kcat` 时,`exec.Command()` 不产生输出

我需要包装kcat一个 Go 函数来读取一系列主题消息,因此考虑使用exec.Command()如下:


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:


/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)


(注意:我在 docker 容器中运行它,但我认为这没有什么不同)


但是,当直接从 CLI 运行时,这可以正常工作:


/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"}]


在 Gokcat中中断的命令似乎有一些独特之处。exec.Command()

问题:

  • 有没有其他方法可以在 Go 中达到相同的效果?

  • 这可能是我使用方式的问题吗exec.Command()

理想情况下,我可以在这种情况下使用该kcat命令,因为我想避免在这种情况下使用 segmentioskafka-go库。



慕标5832272
浏览 198回答 2
2回答

慕无忌1623718

正如输出所说,生产者模式正在自动选择尝试使用带有单独参数的消费者模式cmd := exec.Command("kcat", "-C", "-b", "kafka.kafka.svc.cluster.local:9092", "-t", "messages", "-o", "11000", "-c", "11333")

胡子哥哥

执行命令:cmd := exec.Command("kcat", "-b kafka.kafka.svc.cluster.local:9092", "-t messages", "-o 11000", "-c 11333")与shell命令相同:kcat "-b kafka.kafka.svc.cluster.local:9092" "-t messages" "-o 11000" "-c 11333"你需要分开你的参数,就像默认情况下shell在每个空间上为你做的一样:cmd := exec.Command("kcat", "-b", "kafka.kafka.svc.cluster.local:9092", "-t", "messages", "-o", "11000", "-c", "11333")
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go