Maison > développement back-end > Golang > Comment diffuser le résultat d'une commande en temps réel au lieu d'attendre la fin de l'exécution ?

Comment diffuser le résultat d'une commande en temps réel au lieu d'attendre la fin de l'exécution ?

Mary-Kate Olsen
Libérer: 2024-11-17 21:00:03
original
407 Les gens l'ont consulté

How to Stream Command Output in Real-time Instead of Waiting for Execution Completion?

Exécuter une commande et diffuser sa sortie

Problème : affichage de sortie retardé

Actuellement, votre code traite une commande et n'affiche sa sortie qu'une fois l'exécution terminée. Vous recherchez une solution pour diffuser la sortie en direct au lieu d'attendre la fin du processus.

Solution : diffusion en continu de la sortie de commande

Utilisez l'approche suivante pour diffuser la commande 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]

    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

Explication

  • cmd.StdoutPipe() crée un canal qui fournira toute sortie écrite par la commande.
  • scanner := bufio.NewScanner(stdout) initialise un scanner qui lira la sortie du pipe.
  • scanner.Split(bufio.ScanRunes) garantit que le scanner lit et traite chaque caractère (rune) de la sortie.
  • La boucle for lit en continu les caractères du tube stdout et les imprime à l'écran.
  • Une fois l'exécution de la commande terminée, cmd.Wait() vérifie son succès ou son échec et enregistre le résultat.

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