Je dois traiter une sortie longue d'un script et trouver des données. Ces données seront très probablement situées au tout début de la sortie. Une fois les données trouvées, je n'ai plus besoin de traiter la sortie et je peux quitter.Comment forcer golang à fermer le tuyau ouvert
Le problème que je ne peux pas arrêter de traiter la sortie parce que exec.Cmd
n'a aucune fonction pour fermer la commande ouverte.
Voici un code simplifié (gestion des erreurs a été ommited):
func processOutput(r *bufio.Reader)(){
for {
line, _, err := r.ReadLine()
if some_condition_meet {
break
}
......
}
return
}
func execExternalCommand(){
cmdToExecute := "......"
cmd := exec.Command("bash", "-c", cmdToExecute)
output, _ := cmd.StdoutPipe()
cmd.Start()
r := bufio.NewReader(output)
go processOutput(r)
cmd.Wait()
return
}
Que dois-je faire à la fin à processOutput
fonction pour arrêter cmd? Peut-être qu'il y a une autre façon de le résoudre.
Merci
Que voulez-vous dire qu'il n'y a aucun moyen de "fermer la commande ouverte"? Vous terminez un processus en lui envoyant un signal pour quitter, ce que vous pouvez faire avec les méthodes 'Kill' ou' Signal'. – JimB
Si la commande lit stdin et quitte sur EOF, fermez stdin à la commande. Sinon, envoyez un signal comme mentionné dans les autres commentaires. –
Juste pour ajouter un peu plus de détails, si vous fermez stdin, les écritures stdout du sous-processus lui feront recevoir un signal SIGPIPE (par défaut, à moins que ce comportement ne soit ignoré). Donc, vous envoyez un signal d'une manière ou d'une autre. –