我有一些关于pyinotify的基本问题,我似乎无法找到其他地方的答案。
1)对于连续目录监视器(和事件处理器),是否需要有一个while(True)循环,或者是通知监视器处理的连续事件“循环”并在我删除监视时结束?
2)当inotify实例“开启”时文件是否预先存在会发生什么?最初我只想监视IN_CREATE,但这不会处理预先存在的文件。
3)与#2类似,如果在我的事件处理器功能中创建文件会发生什么? pyinotify会将其缓存在队列中并在'循环'再次启动时处理它,还是会丢失此事件?
答案 0 :(得分:2)
您需要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
开始使用source code:
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's answer中的评论。