我正在尝试通过管道传输命令的输出,但在写入端关闭之前似乎不会从管道中读取任何数据。最终我希望它连接到一个 websocket,该 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 秒,并且有源源不断的更新,因此一次性全部完成会很烦人。
事实证明,问题不在我上面发布的代码中。这按预期工作。问题是正在执行的 C 程序没有正确刷新stdout
。当以交互方式运行它时,它按预期工作,但是当stdout
是通过管道传输的,直到我打电话之前它实际上不会被写入flush
。在c程序中手动添加一些flush语句后,go代码按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)