猿问

Golang管道实时子命令输出

我正在尝试通过管道传输命令的输出,但在写入端关闭之前,似乎没有数据从管道中读取。最终我希望它连接到一个 websocket,它在执行命令时传输命令的状态。问题在于,虽然此代码逐行打印消息,但在程序完成执行之前它不会打印任何内容。


cmd := exec.Command(MY_SCRIPT_LOCATION, args)


// create a pipe for the output of the script

// TODO pipe stderr too

cmdReader, err := cmd.StdoutPipe()

if err != nil {

    fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)

    return

}


scanner := bufio.NewScanner(cmdReader)

go func() {

    for scanner.Scan() {

        fmt.Printf("\t > %s\n", scanner.Text())

    }

}()


err = cmd.Start()

if err != nil {

    fmt.Fprintln(os.Stderr, "Error starting Cmd", err)

    return

}


err = cmd.Wait()

if err != nil {

    fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)

    return

}

有什么办法可以做类似的事情,让扫描仪在写入管道时逐行读取,而不是在所有内容都写入之后?该程序运行大约需要 20 秒,并且有源源不断的更新,因此让它们一次全部通过是很烦人的。


HUH函数
浏览 548回答 2
2回答

料青山看我应如是

事实证明,问题不在我上面发布的代码中。这按预期工作。问题是正在执行的 C 程序没有正确刷新stdout。当以交互方式运行它时,它按预期工作,但是当stdout通过管道传输时,它实际上不会被写入,直到我调用flush. 在 c 程序中手动添加一些flush 语句后,go 代码按预期工作。
随时随地看视频慕课网APP

相关分类

Go
我要回答