Maison  >  Article  >  développement back-end  >  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
Mary-Kate Olsenoriginal
2024-11-17 21:00:03334parcourir

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:])
}

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!

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