首頁 >後端開發 >Golang >如何在 Go 中檢索和處理長時間運行的 Shell 命令的即時輸出?

如何在 Go 中檢索和處理長時間運行的 Shell 命令的即時輸出?

DDD
DDD原創
2024-12-30 09:44:09229瀏覽

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