Watchdog(osx)未通知远程网络更改

时间:2012-02-28 23:07:45

标签: python monitoring watchdog fsevents kqueue

我正在使用Watchdog监视网络目录,非递归,以便随着时间的推移创建特定模式的文件。我看到的问题是,虽然我在本地测试时效果很好,但如果我从远程计算机更改受监控目录,则不会触发事件。

以下是我的配置的具体细节:

  • OSX
  • 在NFS挂载上监视单个目录,非递归
  • python 2.6

使用stock示例代码段可以轻松复制我的问题示例:

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限制的内容(或者可能是OSX上的FSEvents,因为它首先由Watchdog表示首选)?

我在这个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

所以至少现在,我可以使用轮询观察者而不必修改我的代码,直到有人能够解释我遇到的真正问题。

1 个答案:

答案 0 :(得分:6)

我很确定文件系统事件不能通过NFS工作 - 原因是内核管理文件系统事件的方式通常是内核中有一个触发活动的层 - 使用NFS时没有任何设施通知更改,你只能得到一个inode列表,写一些块,读一些块..等等。这是非常小的。

要使文件系统事件在NFS上工作,您必须不断轮询NFS服务器。

对于AFP可能有一些设施,如果你已经获得了果汁,你可以安装netatalk并试试。

如果你绝对需要做这样的事情并且netatalk不这样做 - 最好的办法是让OSXFuse启动并运行并写一个实际上只是坐在那里并轮询更改的NFS覆盖。但是,您将被限制为“截断,修改,追加,删除”等。

另请参阅:Use libfuse in a project, without root access (for installation)? FTP mounts & inotify/kqueue/FSEvents