登录
首页 >  Golang >  Go问答

无缓冲方式读取 exec 命令的 stdout

来源:stackoverflow

时间:2024-03-20 18:15:23 144浏览 收藏

使用 exec.Command 在 Go 中运行命令时,某些系统上的输出可能被缓冲。这意味着,除非命令生成足够多的数据,否则无法立即接收输出。 为了可靠地获得更直接的输出,可以使用 stdbuf -oL 。stdbuf 命令是一个缓冲控制工具,可以将命令的输出设置为行缓冲模式,从而使输出立即显示,而无需等待缓冲区填满。

问题内容

我正在通过 exec.command 在 go 中运行命令并扫描输出。在某些系统上,输出是立即的。但在某些系统上,输出似乎被缓冲了。除非命令生成的数据量足够大,否则我实际上不会收到输出。

是否有办法可靠地获得更直接的输出?

package main

import (
        "fmt"
        "log"
        "os/exec"
        "time"
)

func main() {
        cmd := exec.Command("udevadm", "monitor")
        stdout, err := cmd.StdoutPipe()
        if err != nil {
                log.Fatal(err)
        }

        err = cmd.Start()
        if err != nil {
                log.Fatal(err)
        }

        for {
                p := make([]byte, 10)
                n, _ := stdout.Read(p)
                fmt.Println("@ ", time.Now().Unix(), " ", n)
        }
}

解决方案


我建议运行 stdbuf -oL udevadm 将有效实现我之后的目标(行缓冲输出)。

今天关于《无缓冲方式读取 exec 命令的 stdout》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>