8

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

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

  • 操作系统
  • 在 NFS 挂载上监视单个目录,非递归
  • 蟒蛇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 限制的某些内容(或者可能是 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

所以至少现在,我可以使用投票观察者,而不必修改我的代码,直到有人可以阐明我遇到的真正问题。

4

1 回答 1

7

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

为了使文件系统事件在 NFS 上运行,您必须不断地轮询 NFS 服务器。

AFP 可能有一些功能,如果你有这个功能,你可以安装netatalk并尝试一下。

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

另请参阅:在项目中使用 libfuse,没有 root 访问权限(用于安装)?FTP 挂载和 inotify/kqueue/FSEvents

于 2012-02-29T12:18:23.493 回答