8

私は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

したがって、少なくとも今のところ、誰かが私が抱えている実際の問題に光を当てるまで、ポーリングオブザーバーを使用でき、コードを変更する必要はありません。

4

1 に答える 1

7

ファイルシステムイベントはNFSでは機能しないと確信しています-カーネルがファイルシステムイベントを通常管理する方法は、カーネル内にアクティビティでトリガーするレイヤーがあるためです-NFSでは変更を通知する機能がありません、iノードのリストを取得したり、いくつかのブロックを書き込んだり、いくつかのブロックを読み取ったりすることしかできません。これは非常に最小限です。

ファイルシステムイベントがNFSで機能するには、NFSサーバーを常にポーリングする必要があります。

AFPを使用すると、このための機能がいくつかある可能性があります。ジュースがあれば、netatalkをインストールして試してみてください。

どうしてもこのようなことをする必要があり、netatalkがそれを行わない場合、最善の策は、OSXFuseを起動して実行し、実際にそこに座って変更をポーリングするNFSオーバーレイを作成することです。ただし、「切り捨て、変更、追加、削除」などに制限されます。

関連項目:rootアクセスなしで(インストール用に)プロジェクトでlibfuseを使用しますか?FTPマウントとinotify/kqueue / FSEvents

于 2012-02-29T12:18:23.493 に答える