我想及时将一个进程的输出重定向到log.如果我像这样等待过程完成,我可以做到:

cmd := exec.Command("yes", "Go is awesome") // Prints "Go is awesome", forever 
out, err := cmd.CombinedOutput()
log.Printf("%s", out)

但是,如果该过程需要很长时间或没有完成,这就没有什么用处了.我知道我可以像这样实时写信给stdout:

cmd := exec.Command("yes")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()

不过,这并不能真正帮助我,因为我正在编写一个不是写入终端的服务.我在找一些能让我做一些事情的东西,比如:

cmd := exec.Command("yes")
cmd.Stdout = log.Stdout
cmd.Stderr = log.Stdout
cmd.Run()

log不允许直接访问其编写器,因此这是不可能的.当然,我不是唯一一个有这个问题的人,这通常是怎么做的?

推荐答案

您应该在这里使用pipe,例如:

stdout, err := cmd.StdoutPipe()
if err != nil {
    return 0, err
}

// start the command after having set up the pipe
if err := cmd.Start(); err != nil {
    return 0, err
}

// read command's stdout line by line
in := bufio.NewScanner(stdout)

for in.Scan() {
    log.Printf(in.Text()) // write each line to your log, or anything you need
}
if err := in.Err(); err != nil {
    log.Printf("error: %s", err)
}

我在这里只处理了Stdout个,但是可以同时处理Stderr个,例如使用Goroutine.

Go相关问答推荐

try 用GitHub操作中的release标签更新version. go文件,但失败了

获取k8s群集作用域运算符的命名空间

重新赋值变量时未清除动态类型-这是错误吗?

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

Go安装成功但没有输出简单的Hello World

使用 Golang 获取目录磁盘使用情况

转到 bufio.Writer、gzip.Writer 并上传到内存中的 AWS S3

用接口来模拟amqp091go的困难

Go Programming Language书上的例子server2错了吗?

从给定顶点查找图形中所有闭合路径的算法

如何判断范围内的字段?

甚至用天真的洗牌分配?

Golang 中的泛型类型转换

我如何使用 TOML fixtures 在使用 Go Buffalo 框架的开发环境中为我的数据库 seeder ?

无法使用 Golang 扫描文件路径

在 Go 中发送 ack 和 term 后消息仍在 nats 限制队列中

没有堆栈跟踪的 go 程序崩溃是什么意思?

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

有没有办法在golang中映射一组对象?

更改单个像素的 colored颜色 - Golang 图像