Shell

從管道讀取數據一段時間(以秒為單位)

  • April 10, 2017

有沒有一種簡單的方法可以創建只持續給定的壁時間的管道?

我希望能夠在一段時間內(而不是字節或行)對正在寫入的 STDOUT 內容進行“快照”。就像是

tail -f /var/log/whatever.log | pipe_for_seconds 10 > ./10_second_sample_of_log

我正在使用 BASH,但如果這在其他一些 shell 中非常容易,我想听聽它。

Gnu coreutils從 7.0 版開始有一個timeout命令:

timeout 10 tail -f /var/log/whatever.log 

如果你真的需要一個管道來超時一些稍微不同的過程,然後管道進入timeout

tail -f /var/log/whatever.log | timeout 10 cat > ./10_second_sample_of_log

請注意,儘管終止管道的某些任意部分可能會因緩衝而導致問題,具體取決於信號和程序行為(此問題涵蓋相關問題:關閉管道中的緩衝)。它通常也會更改程序的退出程式碼

如果您沒有(最近的)coreutils,這個簡單的超時程序也可以很好地工作 http://www.unixlabplus.com/unix-prog/timeout/timeout.html 或 perl 方法:

tail -f /var/log/whatever.log | perl -n -e 'BEGIN{alarm 10; $|=1}; print;'

(注意$|=1關閉輸出緩衝,這是為了防止流水線中的輸出失去,如上所述。)

(稍微古老的)Netpipes包也有一個timelimit命令(你仍然可以在某些 Linux 系統上找到它)。

這個類似的問題還有更多選擇:如何為 shell 腳本引入超時?

引用自:https://unix.stackexchange.com/questions/70351