私はWatchdogを使用して、時間の経過とともに作成される特定のパターンのファイルについて、非再帰的なネットワークディレクトリを監視しています。私が見ている問題は、ローカルでテストすると素晴らしい動作をしますが、リモートマシンから監視対象ディレクトリに変更を加えても、イベントがトリガーされないことです。
これが私の構成の具体的な詳細です:
- OSX
- NFSマウントで、再帰的ではない単一のディレクトリを監視する
- Python 2.6
私の問題の例は、ストックサンプルスニペットを使用して簡単に再現できます。
import sys
import time
import logging
from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
event_handler = LoggingEventHandler()
observer = Observer()
observer.schedule(event_handler, path=sys.argv[1], recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
これをネットワークディレクトリで開始し、同じシステムから変更を加えると、イベントがディスパッチされます。ただし、ネットワーク上の別のマシンからディレクトリに変更を加えた場合、イベントはディスパッチされません。
kqueueの制限に関する何かが欠けていますか(または、Watchdogによって最初に優先されると言われているため、OSXのFSEventsである可能性があります)?
私はこのpythonパッケージに夢中になり、ファイルシステムのポーリングを置き換える他のスクリプトに使用し始めようとしていましたが、この問題が発生する理由に関する情報が見つからないようです。
アップデート
MacFSEventsもテストしましたが、同じ問題が発生しました。次に、上記のテストスクリプトを変更して、さまざまなオブザーバーを強制的に試行しました。
# does not work with remote changes
from watchdog.observers.fsevents import FSEventsObserver as Observer
# does not work with remote changes
from watchdog.observers.kqueue import KqueueObserver as Observer
# only option that works because its actually polling every second
from watchdog.observers.polling import PollingObserver as Observer
したがって、少なくとも今のところ、誰かが私が抱えている実際の問題に光を当てるまで、ポーリングオブザーバーを使用でき、コードを変更する必要はありません。