Maison > développement back-end > Golang > Comment puis-je récupérer et traiter la sortie en temps réel des commandes Shell de longue durée dans Go ?

Comment puis-je récupérer et traiter la sortie en temps réel des commandes Shell de longue durée dans Go ?

DDD
Libérer: 2024-12-30 09:44:09
original
228 Les gens l'ont consulté

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

Récupération de sortie en direct à l'aide des commandes Shell

Lors de l'exécution de commandes Shell de longue durée avec os/exec dans Go, il est souvent avantageux de récupérer et de traiter la sortie en temps réel . Prenez, par exemple, la commande ffmpeg, qui génère des informations de progression sous la forme de lignes comme celle-ci :

frame=  101 fps=0.0 q=28.0 size=      91kB time=00:00:04.13 bitrate= 181.2kbits/
Copier après la connexion

Notre objectif est de capturer et de traiter ces lignes, en extrayant les informations de progression pour afficher une barre de progression en direct. .

Solution : Utiliser stderr pour les messages de diagnostic

Contrairement à stdout, ffmpeg envoie des messages de diagnostic (sortie de la console) à stderr. En modifiant notre code pour lire à partir de stderr à la place, nous pouvons capturer les informations de progression :

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()
}
Copier après la connexion

Avec cette modification, nous pouvons imprimer en continu les informations de progression pendant l'exécution de la commande.

Extraction de la progression Informations

Pour extraire les informations de progression, nous devons analyser les lignes de stderr et isoler les valeurs pertinentes. Dans le cas de ffmpeg, nous nous intéressons au champ "time":

time=00:00:04.13
Copier après la connexion

En analysant cette valeur et en la convertissant en un ratio (par exemple, "4,13 secondes / durée totale"), nous pouvons afficher la progression sous forme de pourcentage. Cela nous permet de suivre la progression de la commande en temps réel et d'offrir une expérience conviviale.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal