gpt4 book ai didi

python - 看门狗(osx)不通知远程网络更改

转载 作者:太空狗 更新时间:2023-10-29 21:47:24 33 4
gpt4 key购买 nike

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

这里是我配置的具体细节:

  • 操作系统
  • 在 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 限制的信息(或者可能是 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

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

最佳答案

我很确定文件系统事件不能在 NFS 上工作——原因是内核通常管理文件系统事件的方式是它在内核中有一个触发事件的层——NFS 没有设施通知更改,您只能获取 inode 列表、写入一些 block 、读取一些 block ......等等。这是非常小的。

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

AFP 可能有一些工具,如果你有足够的能力,你可以安装 netatalk并尝试一下。

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

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

关于python - 看门狗(osx)不通知远程网络更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9491225/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com