Shell
從管道讀取數據一段時間(以秒為單位)
有沒有一種簡單的方法可以創建只持續給定的壁時間的管道?
我希望能夠在一段時間內(而不是字節或行)對正在寫入的 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 腳本引入超時?