首頁  >  文章  >  後端開發  >  是否存在將程式的輸出作為流逐行讀取的概念?

是否存在將程式的輸出作為流逐行讀取的概念?

PHPz
PHPz轉載
2024-02-05 23:18:13651瀏覽

是否存在將程式的輸出作為流逐行讀取的概念?

問題內容

我有一個shell 指令(例如journalctl -f -o json),它不斷地將行流傳輸到標準輸出。

我想逐行檢索此輸出並進一步處理。

os/exec 的文件解決如何讀取指令的輸出,io 處理流緩衝。

在我看來,處理過程都經過一個固定的緩衝區,該緩衝區被讀入、處理和進一步寫入。我的問題是該緩衝區的大小是固定的並且與內容無關。

有沒有辦法逐行讀取傳入流(在我的例子中是 shell 指令的輸出)?可能有比 io 讀者更進階的函式庫?


正確答案


使用cmd.stdoutpipe() 取得(管道)使用cmd.start() 啟動該進程之前的輸出( start() 啟動命令但不等待其完成)。

並使用 bufio.scanner 讀取輸入 (io.reader) 行 -逐行。

例如,我將使用這個 bash 腳本列印當前時間 3 次,並在每次之間睡眠 1 秒:

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

執行此命令並逐行讀取其輸出的範例:

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

(每行開頭的第一個日期時間來自log 包,以驗證每行在第二次延遲後列印,另一個時間戳記是date 命令的輸出。)

以上是是否存在將程式的輸出作為流逐行讀取的概念?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除