【发布时间】:2012-02-28 23:07:44
【问题描述】:
我正在使用Watchdog 来监控网络目录,非递归的,用于随着时间的推移创建特定模式的文件。我看到的问题是,虽然我在本地测试时效果很好,但如果我从远程机器更改受监控的目录,则不会触发事件。
以下是我的配置的具体细节:
- OSX
- 在 NFS 挂载上以非递归方式监控单个目录
- python 2.6
使用股票示例 sn-p 可以轻松复制我的问题示例:
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
所以至少现在,我可以使用轮询观察者,而不必修改我的代码,直到有人能够阐明我遇到的真正问题。
【问题讨论】:
-
这对我有用!谢谢!
标签: python monitoring watchdog fsevents kqueue