Pipe

強制 ping 在中斷前寫入

  • December 8, 2014

我正在嘗試讓 ping 連續向文件寫入一些時間。當我跑

$ ping 10 10.1.10.28 | perl -ne '/time=(\d+\.\d+)/ && print "$1\n"'

它每幾毫秒返回一個數字:

$ ping 10 10.1.10.28  | perl -ne '/time=(\d+\.\d+)/ && print "$1\n"'
191.523
312.225
127.506

但是,當我將其重定向到一個文件,並將tail -f該文件重定向到其他地方時,什麼也沒有發生。當我按下 Ctrl-C 時,文件中沒有寫入任何內容。

當新數據進入時,如何強制 ping 寫入 STDOUT?

您遭受管道緩衝的困擾。通常輸出到非互動式終端被緩衝到 4Kb 塊,直到通過管道傳遞,所以你必須禁用它。

您可以像這樣更改命令行:

$ stdbuf -oL ping 10.1.10.28  | perl -ne '$|=1; /time=(\d+\.\d+)/ && print "$1\n"' > file

stdbuf是 coreutils 的一部分。

$|=1;在 perl 中禁用輸出緩衝的方法。

PD 我刪除了 ping 命令中多餘的“10”。

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