Heim  >  Artikel  >  Backend-Entwicklung  >  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
PHPznach vorne
2024-02-05 23:18:13651Durchsuche

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

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)
}

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
🎜 (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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen