出力がファイルにリダイレクトされないのはなぜですか?

出力がファイルにリダイレクトされないのはなぜですか?

Perlスクリプトを介して毎秒vmstatを出力し、各行にタイムスタンプを表示する次のコマンドラインがあります。

vmstat 15 | /home/Beer/addtimestamp.pl > File_1 

addtimestamp.plの内容:

!/usr/bin/perl while (<>) { print localtime() . ": $_"; }

それでは、出力が「File_1」ファイルにリダイレクトされないのはなぜですか?

これを行わない場合はうまく機能し、問題なく毎秒完全に出力を印刷します。

答え1

あなたはバッファトラップに閉じ込められています。 Perl は出力をバッファリングし、バッファがいっぱいになったときだけディスクに書き込みます。バッファリングはパフォーマンスの面では良いですが、低いデータレートでは混乱する可能性があります。十分に長く待つと、ファイルが記録されていることを確認できます(tail -F File_1.標準バッファサイズは4kBだと思います。

$|=1Perlでバッファリングを無効にするには、以下を追加します。

vmstat 1 | perl -e '$| = 1; while (<>) { print localtime() . ": $_"; }' > /tmp/fileetje

関連情報