Maison  >  Article  >  développement back-end  >  Existe-t-il un concept de lecture de la sortie d'un programme ligne par ligne sous forme de flux ?

Existe-t-il un concept de lecture de la sortie d'un programme ligne par ligne sous forme de flux ?

PHPz
PHPzavant
2024-02-05 23:18:13651parcourir

Existe-t-il un concept de lecture de la sortie dun programme ligne par ligne sous forme de flux ?

Contenu de la question

J'ai une commande shell (comme journalctl -f -o json) qui diffuse en continu les lignes vers la sortie standard.

Je veux ligne par ligne récupérer cette sortie et la traiter davantage.

os/exec 的文档解决了如何读取命令的输出,io Gérez la mise en mémoire tampon des flux.

Il me semble que tout le traitement passe par un tampon fixe qui est lu, traité et écrit ultérieurement. Mon problème est que la taille de ce tampon est fixe et indépendante du contenu.

Existe-t-il un moyen de lire le flux entrant (dans mon cas, la sortie d'une commande shell) ligne par ligne ? Peut-être existe-t-il une bibliothèque de niveau supérieur au lecteur io ? io 读者更高级的库?


正确答案


使用 cmd.stdoutpipe() 获取(管道)使用 cmd.start() 启动该进程之前的输出( start()

Bonne réponse

bufio.scanner 读取输入 (io.readerUtilisez cmd .stdoutpipe() Obtenez (pipeline) en utilisant cmd.start( ) Sortie avant de démarrer le processus ( start() démarre la commande mais n'attend pas qu'elle se termine).

et utilisez

) ligne - ligne par ligne.

Par exemple, j'utiliserai ce script bash pour imprimer l'heure actuelle 3 fois et dormir 1 seconde entre chaque fois :

for i in {1..3}; do date; sleep 1; done

Exemple d'exécution de cette commande et de lecture de sa sortie ligne par ligne : log 包,以验证每行在第二次延迟后打印,另一个时间戳是 date

cmd := exec.command("bash", "-c", "for i in {1..3}; do date; sleep 1; done")
out, err := cmd.stdoutpipe()
if err != nil {
    log.fatal(err)
}
defer out.close()

err = cmd.start()
if err != nil {
    log.fatal(err)
}

scanner := bufio.newscanner(out)
for scanner.scan() {
    line := scanner.text()
    fmt.println("output:", line)
}

Exemple de sortie : 🎜
2022/11/29 14:38:48 Output: Tue Nov 29 02:38:48 PM CET 2022
2022/11/29 14:38:49 Output: Tue Nov 29 02:38:49 PM CET 2022
2022/11/29 14:38:50 Output: Tue Nov 29 02:38:50 PM CET 2022
🎜 (Le premier datetime au début de chaque ligne provient de la sortie de la commande 🎜.) 🎜

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer