J'écris un programme en Go qui exécute un programme de type serveur (également Go). Maintenant, je veux avoir le stdout du programme enfant dans ma fenêtre de terminal où j'ai démarré le programme parent. Une façon de le faire est d'utiliser la cmd.Output()
fonction, mais cela n'imprime le stdout qu'une fois le processus terminé. (C'est un problème car ce programme de type serveur fonctionne pendant longtemps et je souhaite lire la sortie du journal)
La variable out
est de type io.ReadCloser
et je ne sais pas ce que je dois en faire pour accomplir ma tâche, et je ne trouve rien d'utile sur le Web à ce sujet.
func main() {
cmd := exec.Command("/path/to/my/child/program")
out, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
}
err = cmd.Start()
if err != nil {
fmt.Println(err)
}
//fmt.Println(out)
cmd.Wait()
}
Explication au code: décommentez la Println
fonction pour obtenir le code à compiler, je sais que ce Println(out io.ReadCloser)
n'est pas une fonction significative.
(il produit la sortie &{3 |0 <nil> 0}
) Ces deux lignes sont juste nécessaires pour obtenir le code à compiler.
io.Copy
dans les routines allercmd.Wait()
ou de faire lafor{}
boucle ... pourquoi sont-ils ici?Réponses:
Pas besoin de jouer avec des pipes ou des goroutines, celui-ci est facile.
la source
cmd.Stdin = os.Stdin
ce qui fait comme si vous aviez littéralement exécuté cette commande à partir de votre shell.log
au lieu de stdout, il y a une réponse iciJe crois que si vous importez
io
etos
et remplacer ceci:avec ça:
(voir documentation pour
io.Copy
et pouros.Stdout
), il fera ce que vous voulez. (Avertissement: non testé.)Au fait, vous voudrez probablement aussi capturer l'erreur standard, en utilisant la même approche que pour la sortie standard, mais avec
cmd.StderrPipe
etos.Stderr
.la source
os.Stdout
) et (2) de confirmer la prémisse que, si vous n'appelez pascmd.StdoutPipe()
du tout, la sortie standard va/dev/null
plutôt que vers la sortie standard du processus parent. .Pour ceux qui n'en ont pas besoin dans une boucle, mais qui aimeraient que la sortie de la commande fasse écho dans le terminal sans avoir à
cmd.Wait()
bloquer d'autres instructions:la source