Pipe
強制 ping 在中斷前寫入
我正在嘗試讓 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”。