2

Minecraft サーバー用に C で inotify ウォッチャーを作成しています。基本的に、server.log を監視し、最新の行を取得して解析し、正規表現と一致する場合は; いくつかのアクションを実行します。

プログラムは、「正規表現に一致するエコー文字列 >> server.log」を介して正常に動作し、解析して必要な処理を実行します。ただし、文字列が Minecraft サーバー経由でファイルに自動的に書き込まれる場合、サーバーをシャットダウンするか (場合によっては) ログアウトするまで機能しません。

私はコードを投稿しますが、ext4がデータをディスクにフラッシュすることや、それらの行に沿った何かと関係がないかどうか疑問に思っています。ファイルシステムの問題。ただし、ファイルが更新されるたびに「tail -f server.log」が更新されるため、その場合は奇妙になります。

4

3 に答える 3

3

私自身の問題を解決しました。ウォッチャーがログ ファイルから読み取るよりも、サーバーがログ ファイルに書き込む速度の方が速いことが判明しました。そのため、ウォッチャーは同期していませんでした。

「ログファイルの現在の行数がログの記録された長さよりも多い場合、2つが等しくなるまでファイルを再処理する」というイベントを処理した後にチェックを追加して修正しました。

ご協力いただきありがとうございます!

于 2011-10-20T21:42:09.780 に答える
1

おそらくそれはIN_CLOSE、サーバーがシャットダウンする(そしてログファイルのハンドルを閉じる)まで発生しない可能性のあるイベントを監視しているためです。呼び出しの有効なマスクパラメータについては、man inotify(7)を参照してください。inotify_add_watch()使いたくなると思いますIN_WRITE

于 2011-10-20T02:00:49.547 に答える
0

あなたの理論はおそらく正しいです.ログファイルはOSによってバッファリングされており、ログライターはそのバッファをフラッシュしていないため、ファイルが閉じられるかバッファがいっぱいになるまですべてがバッファに残ります. テストする簡単な方法は、ログにイベントが書き込まれることがわかっている時点までログを開始し、強制的に閉じてハンドルを閉じることができないようにすることです。ログが空の場合は間違いなくバッファーです。ファイル ハンドル/記述子を取得できる場合はsetbuf、パフォーマンスを犠牲にして、バッファリングを削除するために使用できます。

于 2011-10-20T06:18:30.777 に答える