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()
bufio.scanner
读取输入 (io.reader
Verwenden 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) }
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
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!