Heim >Backend-Entwicklung >Golang >Wie kann ich Echtzeitausgaben von Shell-Befehlen in Go abrufen und verarbeiten?

Wie kann ich Echtzeitausgaben von Shell-Befehlen in Go abrufen und verarbeiten?

Linda Hamilton
Linda HamiltonOriginal
2024-12-11 04:40:14874Durchsuche

How to Retrieve and Process Real-Time Output from Shell Commands in Go?

Echtzeit-Ausgabeabruf in Go für Shell-Befehle

In Golang bietet das Paket os/exec die Möglichkeit, Shell-Befehle auszuführen. Wenn diese Befehle jedoch Echtzeitausgaben oder Fortschrittsaktualisierungen zurückgeben, ist es erforderlich, diese Informationen dynamisch abzurufen und zu verarbeiten. So erreichen Sie dies:

Zum Erfassen und Verarbeiten der Echtzeitausgabe eines Shell-Befehls in Go sollten Sie den folgenden Ansatz in Betracht ziehen:

package main</p>
<p>import (</p>
<pre class="brush:php;toolbar:false">"bufio"
"fmt"
"io"
"os"
"os/exec"
"strings"

)

func main() {

cmdName := "ffmpeg -i t.webm  -acodec aac -vcodec libx264  cmd1.mp4"
cmdArgs := strings.Fields(cmdName)

cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...)
stderr, _ := cmd.StderrPipe()
cmd.Start()
go printProgress(stderr)
cmd.Wait()

}

// um die verarbeiteten Informationen zu drucken, wenn stderr eine neue Zeile erhält
func printProgress(stderr io.ReadCloser) {

r := bufio.NewReader(stderr)
for {
    line, _, err := r.ReadLine()
    if err != nil {
        fmt.Println("error in reading from stderr:", err)
        break
    }

    // Process the line (e.g., extract the progress percentage)
    percentage, err := extractPercentage(string(line))
    if err != nil {
        fmt.Println("error in extracting percentage:", err)
        continue
    }

    // Print the updated progress ratio
    fmt.Printf("%s%%", percentage)
}

}

// extractPercentage analysiert die Zeile der ffmpeg-Ausgabe und gibt den Fortschritt zurück Prozentsatz.
// Dies setzt das Ausgabeformat in der Frage voraus (z. B. „Frame=... Größe=... Zeit=... Bitrate=...“)
func extractPercentage(line string) (string, error) {

parts := strings.Split(line, " ")
if len(parts) < 4 {
    return "", fmt.Errorf("invalid line format: %s", line)
}

size := parts[2]
sizeUnits := []string{"B", "kB", "MB", "GB", "TB", "PB"}
for i, unit := range sizeUnits {
    if strings.HasSuffix(size, unit) {
        factor := float64(1 << (10 * i))
        sizeBytes, err := strconv.ParseFloat(strings.TrimSuffix(size, unit), 64)
        if err != nil {
            return "", err
        }

        percentage := (sizeBytes / factor) / 100
        return strconv.FormatFloat(percentage, 'f', 2, 64), nil
    }
}

return "", fmt.Errorf("unknown size unit: %s", size)

}

Dieser Ansatz verwendet Pipes, um die Echtzeitausgabe von abzurufen stderr-Stream des Befehls. Es liest und verarbeitet die Ausgabe kontinuierlich, extrahiert die Fortschrittsinformationen und druckt sie dynamisch. Beachten Sie, dass die Funktion extractPercentage in diesem Beispiel den Prozentsatz aus der ffmpeg-Ausgabe extrahiert und dabei das in der Frage erwähnte spezifische Format annimmt. Dies muss möglicherweise basierend auf dem spezifischen Ausgabeformat Ihres Shell-Befehls angepasst werden.

Das obige ist der detaillierte Inhalt vonWie kann ich Echtzeitausgaben von Shell-Befehlen in Go abrufen und verarbeiten?. 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