首页 >后端开发 >Golang >如何在 Go 中检索和处理长时间运行的 Shell 命令的实时输出?

如何在 Go 中检索和处理长时间运行的 Shell 命令的实时输出?

DDD
DDD原创
2024-12-30 09:44:09228浏览

How Can I Retrieve and Process Real-time Output from Long-Running Shell Commands in Go?

使用 Shell 命令进行实时输出检索

在 Go 中使用 os/exec 执行长时间运行的 shell 命令时,实时检索和处理输出通常是有益的。以 ffmpeg 命令为例,它以如下行的形式输出进度信息:

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

我们的目标是捕获并处理这些行,提取进度信息以显示实时进度条.

解决方案:使用 stderr 获取诊断消息

与 stdout 不同,ffmpeg 将诊断消息(控制台输出)发送到标准错误。通过修改代码以从 stderr 读取,我们可以捕获进度信息:

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()
}

通过此修改,我们可以在命令执行时连续打印进度信息。

提取进度信息

要提取进度信息,我们需要解析 stderr 中的行并隔离相关值。就 ffmpeg 而言,我们对“时间”字段感兴趣:

time=00:00:04.13

通过解析该值并将其转换为比率(例如,“4.13 秒/总持续时间”),我们可以以百分比显示进度。这使我们能够实时跟踪命令的进度并提供用户友好的体验。

以上是如何在 Go 中检索和处理长时间运行的 Shell 命令的实时输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

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