首页 >后端开发 >Golang >如何在 Go 中获取 Shell 命令的实时输出?

如何在 Go 中获取 Shell 命令的实时输出?

Barbara Streisand
Barbara Streisand原创
2024-12-08 18:51:15482浏览

How to Get Realtime Output from Shell Commands in Go?

如何在 Go 中检索 Shell 命令的实时输出

问题:

执行长时间运行的 shell 命令时在使用 os/exec 的 Go 中,如何检索实时输出并在其变为时对其进行处理可用吗?

解决方案:

  1. 使用 stderr 而不是 stdout:

    ffmpeg 已知将诊断消息输出到 stderr 而不是 stdout。因此,在创建命令对象时,请连接到 stderr 而不是 stdout。

  2. 连续读取 stderr 的输出:

    创建 bufio.Scanner stderr 并使用 Scan 方法逐行或逐字读取输出word.

  3. 逐行处理输出:

    在示例代码中,使用了scanner.Split(bufio.ScanWords)来分割空格上的输出。根据您的处理要求调整拆分类型。

  4. 处理输出:

    以您想要的方式操作输出,例如提取和处理进度信息。

示例代码:

package main

import (
    "bufio"
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    args := "-i test.mp4 -acodec copy -vcodec copy -f flv rtmp://aaa/bbb"
    cmd := exec.Command("ffmpeg", strings.Split(args, " ")...)

    stderr, _ := cmd.StderrPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stderr)
    scanner.Split(bufio.ScanWords)
    for scanner.Scan() {
        m := scanner.Text()
        fmt.Println(m)
    }
    cmd.Wait()
}

输出:

代码会不断打印ffmpeg输出消息,如:

frame=  101 fps=0.0 q=28.0 size=      91kB time=00:00:04.13 bitrate= 181.2kbits/s

以上是如何在 Go 中获取 Shell 命令的实时输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn