Lors de l'exécution d'une commande à l'aide de la fonction exec.Command, il est souvent souhaitable de rediriger la sortie vers un journal pour de vrai- surveillance du temps. Bien que CombinedOutput puisse capturer l'intégralité de la sortie une fois la commande terminée, elle ne convient pas aux processus de longue durée ou inachevés.
Une solution courante pour la redirection de sortie en temps réel consiste à attribuer directement stdout et stderr aux flux de sortie du système. (os.Stdout et os.Stderr). Cependant, cela peut ne pas être pratique pour les applications qui n'écrivent pas sur un terminal.
Solution utilisant des tuyaux
Pour rediriger la sortie de la commande vers un journal, vous pouvez utiliser des tuyaux . Voici un exemple :
stdout, err := cmd.StdoutPipe() if err != nil { return nil, err } // Start the command with the pipe in place if err := cmd.Start(); err != nil { return nil, err } // Real-time monitoring of stdout in := bufio.NewScanner(stdout) for in.Scan() { log.Printf(in.Text()) // Write line to log or perform other operations } if err := in.Err(); err != nil { log.Printf("Error: %s", err) }
Considérations
Cette méthode gère stdout, mais vous pouvez également gérer stderr en créant un tube et une goroutine séparés. De plus, vous devrez peut-être gérer l'annulation de contexte ou d'autres cas extrêmes pour garantir un nettoyage et une gestion des ressources approprié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!