5

次の状況が発生しています。

  • pyinotify はファイルの IN_CLOSE_WRITE イベントを監視します
  • ファイル内の何かを変更して保存します
  • イベントがトリガーされます
  • ファイルを読んで、変更がないことを確認しました

これを少しいじってみると、デバッグ中にうまく機能することに気付きました。ファイルを読み取る行にブレークポイントを設定して、少し遅延を追加しました。その後、ファイルが読み込まれ、変更が反映されます。

したがって、を追加するtime.sleep(1)か、他の方法で実行を遅らせるとうまくいくようです。そうしないと、時期尚早の IN_CLOSE_WRITE イベントを受け取ります。

変更がコミットされてファイルが閉じられた後、またはそのイベントがトリガーされるかどうか疑問に思いました。IN_CLOSE_WRITE の後、他に関連するイベントはないようです。同時に、ドキュメントは少しトリッキーです。

IN_CLOSE_WRITE を使用します。適切なファイルのすべての変更が発行された場合、ファイル内に安全に書き込まれるためです。

FAQ の文言についてバグ レポートを提出しましたが、それまでの間、この問題について追加の意見を求めたいと思います。これは起こるはずですか?それを解決する「道徳的に正しい」方法は何ですか?

これはすべて、Linux Mint 15 x64 で発生しています。

4

2 に答える 2

4

この動作は異常ではないことが判明しました:

前に述べたように、inotify の使命 (したがって、Pyinotify によって報告されている) は、ファイルが閉じられたとき (より正確にはファイル記述子によって閉じられたとき) に通知することだと思いますが、明らかにカーネルはバッファーを使用するため、ファイル データがすぐにディスクに書き込まれない場合があります。詳細については、close() 関数の man (2) を参照してください。

カーネルが書き込みを遅延させるため、クローズが成功しても、データがディスクに正常に保存されたことは保証されません。ストリームが閉じられたときにファイル システムがバッファをフラッシュすることは一般的ではありません。データが物理的に保存されていることを確認する必要がある場合は、fsync(2) を使用してください。(この時点では、ディスク ハードウェアによって異なります。)

IN_CLOSE_WRITE要するに、データがディスクに書き込まれていることを確認することはできません。

言い換えれば、時期尚早の通知ではなく、適切なタイミングで通知されます。しかし、OS の基礎となるメカニズムは、そのファイルに対して何かを実行し続けることができます。

于 2013-10-16T14:43:09.543 に答える