ホームページ >バックエンド開発 >Golang >Goのシェルコマンドからリアルタイム出力を取得するにはどうすればよいですか?

Goのシェルコマンドからリアルタイム出力を取得するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-08 18:51:15479ブラウズ

How to Get Realtime Output from Shell Commands in Go?

Go でシェル コマンドのリアルタイム出力を取得する方法

問題:

長時間実行されるシェル コマンドを実行する場合Go で os/exec を使用してリアルタイム出力を取得し、それをそのまま処理するにはどうすればよいですか?利用可能ですか?

解決策:

  1. stdout の代わりに stderr を使用します:

    ffmpeg は次のように知られています。診断メッセージを stdout ではなく stderr に出力します。したがって、コマンド オブジェクトを作成するときは、stdout ではなく stderr に接続します。

  2. stderr から出力を継続的に読み取ります:

    Create a bufio.Scanner for stderr を読み込み、Scan メソッドを使用して出力を 1 行ずつ、または 1 ワードずつ読み取ります。 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のシェルコマンドからリアルタイム出力を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。