为了账号安全,请及时绑定邮箱和手机立即绑定

Golang管道实时子命令输出

Golang管道实时子命令输出

Go
HUH函数 2021-10-18 11:01:58
我正在尝试通过管道传输命令的输出,但在写入端关闭之前,似乎没有数据从管道中读取。最终我希望它连接到一个 websocket,它在执行命令时传输命令的状态。问题在于,虽然此代码逐行打印消息,但在程序完成执行之前它不会打印任何内容。cmd := exec.Command(MY_SCRIPT_LOCATION, args)// create a pipe for the output of the script// TODO pipe stderr toocmdReader, 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 秒,并且有源源不断的更新,因此让它们一次全部通过是很烦人的。
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 546 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信