2017-05-04 5 views
1

私はUbuntuの14.04 ext4の上でバージョンinotifyをテストしていないよをしてコピー操作を検出し、コピーまたは作成操作を実行するとき、私は同じ、次のバージョンinotifyイベントを取得:バージョンinotify

CPファイルIN_CREATE

NEWFILE
IN_MODIFY NEWFILE

NEWFILE NEWFILE
IN_CLOSEは

IN_CREATE NEWFILE NEWFILE>> "foo" をエコー IN_MODIFY newfile
IN_CLOSE newfile

この2つの状況を区別する可能性はありますか? コピーが実行され、ソースファイルと宛先ファイルが何であるかという情報を得たいと思います。 Inotifyで実行する可能性がない場合は、他の方法で行うことはできますか?

ありがとうございました。

答えて

1

Unixには「コピー」というものはありません。ファイルをコピーするための最も高度なシステムコール(sendfileとcopy_file_range)でさえ、中間バッファを使用して、2つの独立したファイル間でデータを複製することになります。


しかし、いくつかの推測を使用して、確実な程度のファイルコピーを特定できます。

と仮定、

  1. 2つのファイルが開いていること:AおよびB(特定の順序なし)
  2. AはBが(IN_MODIFY)
  3. Aに書き込まれ
  4. (IN_ACCESS)から読み出されます(IN_CLOSE_NOWRITEによって識別されるように)
  5. Bが書き込み可能にオープンされている(IN_CLOSE_WRITEによって識別される)
  6. AとBとは、同一のデータサイズ(stat.st_size)上記配列がちょうど共通のヒューリスティックではなく、厳密なルールであることその後

注意を有します。 (例えば、ソースファイルを開く前に、ターゲットファイルを切り捨てるか、INCOMODYにするなど)他のイベントがあるかもしれません。コピー処理は、既存のターゲットファイルをリンク解除し、コピー専用の新しいファイルを作成することがあります。この場合、新しいファイルはタイムリーにである必要があります。サブスクリプションレースのためにいくつかの(またはすべての)イベントが見逃されることがあります。サブスクリプションレースは、設計上完全に検出されません。

また、インテイファント・キュー・オーバーフロー(IN_Q_OVERFLOW)のためにイベントが大量に欠落することがあります。

Inotifyはmmap-edファイルでメモリ内のアクションを検出できません。また、mmapはファイルのコピーによく使用されます。したがって、ステップ2と3全体が欠落している可能性があります。

対象となるファイルシステム(および制御されていない環境でinotifyを使用する予定があるかどうか)を指定していないが、一部のファイルシステムがinotifyをサポートしていない可能性があることに注意してください(FUSEベースおよびネットワークファイルシステムは特に問題があります)。これは、FUSEの場合の特定のファイルシステムとカーネルバージョンに依存します。

ハードリンクの作成は厳密にはコピーとは限りませんが、その状況に似た死後のパターン(同じサイズと同じ見た目の内容を持つ2つのファイル)が生成される可能性があります。そのため上記の理由の


あなたは大きな見返りを期待していない限り、inotifyでコピーを識別することは、雑用のあまりです。静的解析を使用してコピーを識別することから始めることを検討してください。なぜなら、とにかくinotifyを使用してフォールバックすることがあるからです。

+0

お返事ありがとうございます。非常に役に立ちます。 –

関連する問題