inotifyイベントが複数回起動する理由


13

この質問は、私がStackoverflowで提起した別の質問から生じます。私が使用していウォッチャーを -同じ問題がに適用されますIncron -離れて変わり、静かにリスのためのDropboxにそれらの変更をフォルダとその子フォルダを監視すること。

write_closeイベントを監視します-- IN_CLOSE_WRITE目的のため。もともと私はmodifyイベント、すなわちIN_MODIFYを見ていました。これは機能しましたが、大きなファイルを書き込むと、複数回起動することがわかりました。それは公平に聞こえたのでIN_CLOSE_WRITE、特定のファイルについては一度しか発生しないと仮定するのが合理的だと感じたため、切り替えました。

ただし、そうではありません。Nanoで作成された非常に小さなテキストファイル(1文字のみ)でも、イベントは2回発生します。せいぜいこれは、同じファイルがDropboxで2回同期されると、不必要なトラフィックになる可能性があります。私の場合、最初のイベントで同期を実行してからサーバー側のファイルを削除するため、災害につながります。結果-2番目のイベントでは、Dropbox側のファイルは0バイトのファイルになります。

私は今のところ、他の作業を行う前に同期スクリプトを10秒間スリープさせ、Dropboxの同期を試みる前に問題のファイルがまだ存在することを確認することで対処しています。これが機能するのは、2回目の反復でファイルが見つからず、スクリプトが終了するだけだからです。

これはせいぜいハックに聞こえます。恐らく悪いハックではないかもしれませんが、私は理解したいと思います-なぜIN_CLOSE_WRITEイベントが複数回発生するのですか?


いくつかの追加情報

  • ウォッチャーのインスタンスが複数実行されていないことを確認してください。

からの出力 ps ax|grep watcher.py

23880 ?        Sl     0:01 python /usr/local/bin/watcher.py restart
24977 pts/0    S+     0:00 grep --color=auto watcher.py

ファイルシステムはext4です。Incronでまったく同じ問題が発生したことに言及する必要があります。経由で実行されるバッチスクリプトからWatcherデーモンを起動します/etc/rc2.d。Incron OTHは、デフォルトのapt-get install incronインストールを介して、私が何もしなくても起動します。


私のwatcher.iniファイルの本質を以下に示します。

[DEFAULT]
logfile=/var/log/watcher.log
pidfile=/var/run/watcher.pid

[job1]
watch=/path/to/watch

events=write_close
excluded=
recursive=true
autoadd=true

command=/home/datastore.php $filename

datastore.php面倒なDropboxアップロード+ソース削除コードなしでスクリプトが2回起動されることを確認するために、スクリプトを必要最低限​​のものに減らしました。

#! /usr/bin/php
<?php
file_put_contents('/tmp/watcher',$argv[1],FILE_APPEND);

?>

次に、問題のパスに小さなファイルを作成して調べました/tmp/watcher。問題は解決しません$argv[1]。ファイルには、まだ2つの連続したエントリがあります。


1
多くのバリエーションを試しましたが、複数のIN_CLOSE_WRITE発砲で問題を再現することはできません。私がやったことは、単一のinotify出力を引き起こします。私は物事を試み続けます。しかし、これまでのところ、質問だけです。どのファイルシステム?Ext4?その他?
lornix

@lornix-私の質問の編集をご覧ください。ファイルシステムがext4あり、Watcherの2つのインスタンスが実行されていないことを合理的に確信しています。Incronでも同じ問題に遭遇しました。
DroidOS

「同期を実行してから、サーバー側のファイルを削除します」と言いました。この削除は2番目のイベントをトリガーしますか?deleteルーチンを無効にして再試行できますか?
ジャーマー

@Germar-私の質問の編集をご覧ください。でもと同期スクリプトは実際sync'ingなしやっていないunlink問題が持続をする
DroidOS

申し訳ありませんが、アイディアではなく、どのマシンでも問題を再現できません。イベントはもう1つしかありません。言及されていない何か他のものが関係しています。アンチウイルスがインストールされていますか?そのような何か?
lornix

回答:


1

よくわかりませんが、おそらく最初のwrite_closeは、作成時間など、ファイル属性をそこに書き込みます。その後、実際のデータを書き込みます。実際、rsyncは一時ファイルを作成し、すべてが完了すると、一時ファイルを同じフォルダー内の実際のファイルに移動するため、rsyncの使用時に通常は作成しやすく、移動はアトミック操作です。一方、inotifyにはワンショットと呼ばれるものがあります。おそらくそれを使用して、最初の変更メッセージで何かをトリガーできます。私は今これを掘っていて、何か新しいものが見つかったら更新します。 /superuser/1133642/traceing-the-moment-when-file-is-completely-copied-to-samba-share-with-inotify


ここでかなり有効なものに指を置いたかもしれません。調査が必要です。ヒントをありがとう。これがなんらかの問題であることがわかった場合は、投稿します。
-DroidOS

ATTRIBがファイル自体に何かを追加するとは思わない、間違っていた。
エディクMkoyan

0

これをコメントとして投稿するのに十分な担当者がいませんが、一時的な、おそらく隠されたファイルは作成されていないと確信していますか?inotifywait複数回起動することで同様の問題がありましたが、vimは編集時に.swpファイルを作成し、閉じるときにイベントを起動するためであることに気付きました。また、元のファイルから終了イベントを取得します。

同じファイルで複数のファイルを起動するイベントに気づいているようですが、これは私が再現できたことではありません-これは一時ファイルと元のファイルに対して一度だけ発生します。

nanoで簡単なテストを試してみたところ、(少なくとも少数の場合は)一時ファイルがまったく作成されないと思いますが、同様の動作に依存する可能性のあるセットアップが他にありますか?


ご提案ありがとうございます。Nanoを使用して非常に簡単な1バイトファイルを作成する場合でも、コンソールからファイルに単一の文字をリダイレクトするだけでも、複数のinotifyの問題に遭遇しました。私が最初の質問で説明した「解決策」は、今のところ私を動かし続けています。しかし、長期的には、エラーが始まるタイミングを特定するために、最初からサーバーを再構築する必要がある唯一の解決策-Incron、Watcher(かつてIncronがあったときに起こった)、MariaDB、Nginx、Redis、Memcachedでのセットアップ...正確に「単純な」ものではありません。
DroidOS

念のため、同じフォルダを2回監視していないかどうかを再確認してください。そうでない場合、たとえば、os x sambaクライアント経由でファイルをsamba共有にコピーすると、これが起こりますcreate、close_write、delete、create、close_write Windowsクライアントでそれを行うと、より合理的なcreate、write_closeなどに見えます。したがって、このIN_MODIFY、IN_ONESHOT / directoryを使用してファイルの最初の変更を監視することで問題を解決します。sleep someTimeコマンドoneshotはそれを行います。
エディクMkoyan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.