Heim > Backend-Entwicklung > Golang > Gibt es ein Konzept, die Ausgabe eines Programms Zeile für Zeile als Stream zu lesen?

Gibt es ein Konzept, die Ausgabe eines Programms Zeile für Zeile als Stream zu lesen?

PHPz
Freigeben: 2024-02-05 23:18:13
nach vorne
690 Leute haben es durchsucht

Gibt es ein Konzept, die Ausgabe eines Programms Zeile für Zeile als Stream zu lesen?

Frageninhalt

Ich habe einen Shell-Befehl (wie journalctl -f -o json), der Zeilen kontinuierlich in die Standardausgabe streamt.

Ich möchte Zeile für Zeilediese Ausgabe abrufen und weiterverarbeiten.

os/exec 的文档解决了如何读取命令的输出,io Behandeln Sie die Stream-Pufferung.

Mir scheint, dass die gesamte Verarbeitung einen festen Puffer durchläuft, der eingelesen, verarbeitet und weiter beschrieben wird. Mein Problem ist, dass die Größe dieses Puffers fest und unabhängig vom Inhalt ist.

Gibt es eine Möglichkeit, den eingehenden Stream (in meinem Fall die Ausgabe eines Shell-Befehls) Zeile für Zeile zu lesen? Vielleicht gibt es eine höhere Bibliothek als den io-Reader? io 读者更高级的库?


正确答案


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

Richtige Antwort

bufio.scanner 读取输入 (io.readerVerwenden Sie cmd .stdoutpipe() Holen Sie sich (Pipeline) mit cmd.start( ) Ausgabe vor dem Starten des Prozesses ( start() startet den Befehl, wartet aber nicht auf dessen Abschluss).

und verwenden Sie

) Zeile für Zeile.

Zum Beispiel werde ich dieses Bash-Skript verwenden, um die aktuelle Zeit dreimal auszudrucken und zwischen jedem Mal 1 Sekunde zu schlafen:

for i in {1..3}; do date; sleep 1; done
Nach dem Login kopieren

Beispiel für die Ausführung dieses Befehls und das zeilenweise Lesen seiner Ausgabe: 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)
}
Nach dem Login kopieren

Beispielausgabe: 🎜
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
Nach dem Login kopieren
🎜 (Die erste Datums- und Uhrzeitangabe am Anfang jeder Zeile stammt aus der Ausgabe des Befehls 🎜.) 🎜

Das obige ist der detaillierte Inhalt vonGibt es ein Konzept, die Ausgabe eines Programms Zeile für Zeile als Stream zu lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage