Maison >développement back-end >Golang >Comment obtenir une sortie en temps réel des commandes Shell dans Go ?

Comment obtenir une sortie en temps réel des commandes Shell dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 18:51:15482parcourir

How to Get Realtime Output from Shell Commands in Go?

Comment récupérer la sortie en temps réel des commandes Shell dans Go

Problème :

Lors de l'exécution d'une commande shell de longue durée dans Go en utilisant os/exec, comment pouvez-vous récupérer la sortie en temps réel et la traiter au fur et à mesure disponible ?

Solution :

  1. Utiliser stderr au lieu de stdout :

    ffmpeg est connu pour afficher des messages de diagnostic sur stderr au lieu de stdout. Par conséquent, connectez-vous à stderr lors de la création de l'objet de commande au lieu de stdout.

  2. Lisez la sortie de stderr en continu :

    Créez un bufio.Scanner pour stderr et utilisez la méthode Scan pour lire la sortie ligne par ligne ou mot par word.

  3. Gérer la sortie ligne par ligne :

    Dans l'exemple de code, un scanner.Split(bufio.ScanWords) est utilisé pour diviser la sortie sur les espaces. Ajustez le type de fractionnement en fonction de vos exigences de traitement.

  4. Sortie du processus :

    Manipulez la sortie de la manière souhaitée, par exemple en l'extrayant et en la traitant. informations de progression.

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

Sortie :

Le code imprimera en continu les messages de sortie ffmpeg, tels que :

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

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!

Déclaration:
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