Heim >Backend-Entwicklung >Golang >Wie erhalte ich eine Echtzeitausgabe von Shell-Befehlen in Go?

Wie erhalte ich eine Echtzeitausgabe von Shell-Befehlen in Go?

Barbara Streisand
Barbara StreisandOriginal
2024-12-08 18:51:15567Durchsuche

How to Get Realtime Output from Shell Commands in Go?

So rufen Sie Echtzeitausgaben für Shell-Befehle in Go ab

Problem:

Beim Ausführen eines Shell-Befehls mit langer Laufzeit Wie können Sie in Go mit os/exec die Echtzeitausgabe abrufen und so verarbeiten, wie sie ist? verfügbar?

Lösung:

  1. Verwenden Sie stderr anstelle von stdout:

    ffmpeg ist bekanntermaßen Diagnosemeldungen an stderr statt an stdout ausgeben. Stellen Sie daher beim Erstellen des Befehlsobjekts eine Verbindung zu stderr statt zu stdout her.

  2. Ausgabe von stderr kontinuierlich lesen:

    Erstellen Sie einen bufio.Scanner für stderr und verwenden Sie die Scan-Methode, um die Ausgabe Zeile für Zeile oder Wort für Zeile zu lesen Wort.

  3. Ausgabe Zeile für Zeile verarbeiten:

    Im Beispielcode wird ein scanner.Split(bufio.ScanWords) zum Teilen verwendet die Ausgabe auf Leerzeichen. Passen Sie den Aufteilungstyp entsprechend Ihren Verarbeitungsanforderungen an.

  4. Ausgabe verarbeiten:

    Manipulieren Sie die Ausgabe auf die gewünschte Weise, z. B. durch Extrahieren und Verarbeiten Fortschrittsinformationen.

Beispiel Code:

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

Ausgabe:

Der Code druckt kontinuierlich die ffmpeg-Ausgabemeldungen, wie zum Beispiel:

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

Das obige ist der detaillierte Inhalt vonWie erhalte ich eine Echtzeitausgabe von Shell-Befehlen in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn