質問

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

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top