1

ログファイルの解析を行い、時には bash コマンドを実行する Perlscript があります。

$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"\`;

次のように perl スクリプトを開始し./perlscript.pl > logfile.logます。

進行状況を監視するためにログファイルをテールしますが、上記の行で毎回出力が停止します。出力はそこで数秒間停止し、その後続行します。???

問題をプロファイルするために、次のようにラップしました。

print `date`;
$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"`;
print `date`;

出力は、コマンドが多くの時間を消費していないことを示しています。

So 6. Okt 22:35:04 CEST 2013
So 6. Okt 22:35:04 CEST 2013

出力をファイルにリダイレクトせずにスクリプトを実行すると、LAG はありません。

理由はありますか?

4

2 に答える 2

2

私はあなたの行動を再現しようとはしていませんが、stdout バッファリングの問題である可能性があります。試してみてください:

$| = 1;
$messagePath = `ls -t -d -1 $dir | head -n 5 | xargs grep -l "$messageSearchString"`;

アップデート

あなたが観察した行動を再現しようとしました: 私はいくつかの仮定をしなければなりませんでしたが、私の疑いは正しかったと信じています. ここではパイプしていますが、ファイルにリダイレクトしてそのファイルを末尾にするのと同じです。

./test.pl |  awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

がない$| = 1場合、出力はバッファリングされ、集約されます。

2013-10-06 23:08:27 Saluton, mondo: /home/lserni/test.sh
2013-10-06 23:08:27
2013-10-06 23:08:27 Waiting 10s...
2013-10-06 23:08:27 Saluton denove!

変更により、各行は生成時に出力されます。

2013-10-06 23:09:09 Saluton, mondo: /home/lserni/test.sh
2013-10-06 23:09:09
2013-10-06 23:09:09 Waiting 10s...
2013-10-06 23:09:19 Saluton denove!

あなたのスクリプトは数秒かかることをしていると思いますが、それはそれを生成していませんmessagePath。Perl が送信するデータのかなりのチャンクを取得するまで、出力は遅延され、失速しているのはその行であるという印象を与えます。

忘れていましたが、タイミングパイプはここから来ています。

于 2013-10-06T20:53:14.520 に答える
0

あなたのような状況では、unbufferコマンドを使用してある程度成功しました。コマンドを tty に出力しているように見える環境でコマンドを実行するため、出力をバッファリングしません。あなたの場合に正確に適用する方法がわからないので、試してみたい場合は、少し実験する必要があります.

于 2013-10-06T22:16:10.353 に答える