Maison > développement back-end > Golang > le corps du texte

Comment diffuser la sortie d'une commande en temps réel à l'aide de Go ?

Mary-Kate Olsen
Libérer: 2024-11-22 00:04:17
original
888 Les gens l'ont consulté

How to Stream Command Output in Real-Time Using Go?

Sortie de commande en streaming en ligne

Considérez le code suivant qui exécute une commande et capture sa sortie :

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]
    // Wait to finish, get output:
    out, err := cmd.Output()
    if err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Println("Finished %s, output: %s", cp[1:], out)
}
Copier après la connexion

Ce code capture la sortie complète de la commande et ne l'imprime qu'une fois l'exécution de la commande terminée. Cependant, il est nécessaire de diffuser la sortie en temps réel.

Pour réaliser une diffusion en direct de la sortie, nous pouvons modifier le code comme suit :

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}
Copier après la connexion

Voici une explication des modifications :

  • cmd.StdoutPipe() crée un tube pour lire le standard de la commande sortie.
  • cmd.Start() démarre la commande en arrière-plan.
  • bufio.NewScanner(stdout) crée un scanner pour lire à partir du tube stdout.
  • scanner. Split(bufio.ScanRunes) configure le scanner pour qu'il lise par runes, fournissant une diffusion en direct.
  • Le scanner La boucle Scan() lit et imprime en continu chaque rune (caractère) produite par la commande.
  • Une fois la boucle terminée (l'écriture de la commande sur stdout est terminée), scanner.Err() vérifie toute erreur.
  • cmd.Wait() attend la fin de la commande et vérifie les erreurs.
  • L'instruction finale log.Println() enregistre le résultat de la commande. achèvement.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal