私は何度も連続してファイルに書き込むために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に書き込まれるようにするにはどうすればよいですか?
答え1
パイプのバッファリングのために問題が発生しています。通常、非対話型端末の出力はパイプされるまで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」を削除しました。