执行命令等待它完成,在Go中发送实时输出

问题描述

我有一个永远循环的二进制文件,每毫秒返回一个输出(吓死了,我知道)。我想通过Go调用它。问题是,(据我所知),Go在显示输出之前将等待命令完成。就我而言,命令在被杀死之前不会完成(我也想通过停止Go程序来停止二进制文件)。这是我所拥有的:

func main(){
  loggerInit := exec.Command("/logger")
  var out Bytes.Buffer
  loggerInit.Stdout = &out
  err = loggerInit.Run()
  if err != nil {
    fmt.Println(err)
  }
  fmt.Printf(out.String())
}

但这不会产生任何输出,并且会一直保留在命令中(实际上,手动运行/logger确实会提供所需的输出)。谢谢,加油!

解决方法

您正在使用Run

运行会启动指定的命令,并等待其完成。

根据您的描述,您应该在哪里使用Start

启动将启动指定的命令,但不等待其完成。

但是,当然,您需要调整代码以等待或循环等,否则您的应用程序将在第一次读取任何输出后立即退出。

,

我认为您可以使用此命令通过Go传递记录器的输出

./logger | main.go

这意味着,记录器产生了一些东西(例如,字节/字符串),然后Go将该输出读取为输入。

main.go

buf := make([]byte,expectedBytes)
for {
    bytes,_ := io.ReadFull(os.Stdin,buf)
    // do it here
    time.Sleep(1 * time.Second)
}

对不起,我的英语希望对您有所帮助。