关于实现pyinotify实例以监控目录的问题
我有一些关于pyinotify的基本问题,找不到答案。
1) 如果我想持续监控一个文件夹(并处理事件),是不是必须要有一个while(True)的循环?还是说这个持续的事件“循环”是由notify watch来处理的,当我移除监控时就结束了?
2) 当我开启inotify实例时,如果文件已经存在,会发生什么?我最开始只想监控文件的创建(IN_CREATE),但这样就无法处理那些已经存在的文件。
3) 和第二个问题类似,如果在我处理事件的函数中创建了一个文件,会发生什么?pyinotify会把这个事件放在队列里等“循环”再次开始时处理,还是我会错过这个事件?
1 个回答
2
- 是否有必要使用 while( True ) 循环?
你需要一个 while-loop
,但可以通过调用 notifier.loop
方法来隐式地设置这个循环:
wm = pyinotify.WatchManager()
mask = pyinotify.IN_CREATE
notifier = pyinotify.Notifier(wm, MyProcessEvent(path))
wdd = wm.add_watch(path, mask, rec=True, auto_add=True)
notifier.loop()
如果你想自己设置 while-loop
,可以参考这个 源代码,它来自 notifier.loop
:
while 1:
try:
notifier.process_events()
# check_events is blocking
if notifier.check_events():
notifier.read_events()
except KeyboardInterrupt:
# Stop monitoring if sigint is caught (Control-C).
break
notifier.stop()
要移除对某个文件或目录的监视,可以调用 wm.rm_watch
。
当 inotify 实例“开启”时,如果文件已经存在,会发生什么?
在调用
wm.add_watch
之前,不会生成任何事件。如果在我处理事件的函数中创建了一个文件,会发生什么?
事件会被放入一个大小为
/proc/sys/fs/inotify/max_queued_events
的缓冲区中。例如,在我的系统上,这个数字是% cat /proc/sys/fs/inotify/max_queued_events 16384
如果在你处理之前的事件时,文件系统生成了足够多的事件填满了缓冲区,那么你会收到一个
IN_Q_OVERFLOW
事件。可以查看 blucz 的回答 中的评论。