0

ログファイルへの変更をリッスンし、適切に動作するスクリプトを作成しています。現在使用してopen my $fh, "tail -f $logfile |";いますが、理想的にはシステムコールを使用したくありません。

File :: Tailを試しましたが、最小間隔は1秒です(パスを少なくしようとしましたが、0をパスしても、デフォルトで1秒になります)。ソースを確認しましたが、整数を取るsleep()を使用しているようです。自分で書く前に、他に選択肢はありますか?

ありがとう。

4

4 に答える 4

6
  1. tail -fもデフォルトで 1 秒のスリープを使用することをご存知ですか? それは本当です!(少なくともGNUテールについては...)
  2. File::Tail実際にはTime::HiRessleep関数を使用します。つまり、スリープ時間パラメーター整数ではありません。システムが処理できる任意の小数秒に設定できます。
于 2010-09-10T02:13:31.250 に答える
3

この正確な質問への回答を含め、ドキュメントには多くの優れた情報があります。perlfaq5の回答から、perl で "tail -f" を実行するにはどうすればよいですか?


初挑戦

seek(GWFILE, 0, 1);

ステートメント seek(GWFILE, 0, 1) は現在の位置を変更しませんが、ハンドルのファイル終了条件をクリアするため、次のステートメントで Perl が何かを再度読み取ろうとします。

それが機能しない場合 (stdio 実装の機能に依存している場合)、次のようなものが必要です。

for (;;) {
  for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
    # search for some stuff and put it into files
  }
  # sleep for a while
  seek(GWFILE, $curpos, 0);  # seek to where we had been
}

これでもうまくいかない場合は、IO::Handle の clearerr メソッドを調べてください。これは、ハンドルのエラーとファイルの終わりの状態をリセットします。

CPAN の File::Tail モジュールもあります。

于 2010-09-10T10:10:06.713 に答える
2

CPANにはFile::ChangeNotify

于 2010-09-10T00:40:31.220 に答える
0

tail -f私の意見では、あなたがすでに行っているようにパイプを使用することに何の問題もありません。多くの場合、「システムコールなし」のような言語の純粋さを求めることは逆効果です。

また、File::Tail長時間実行されるプロセスで問題が発生することもあります。残念ながら、かなり前に起こったので、この主張を確固たる証拠で裏付けることはできません。問題をデバッグせず、代わりにパイプを使用File::Tailしました。tail -F

于 2010-09-10T08:47:19.380 に答える