检测文件系统的变化,依赖于Linux内核的inotify功能。
pip install pyinotify
import pyinotify
monitorObj = pyinotify.WatchManager()
monitorObj.add_watch(path,pyinotify.ALL_EVENTS, rec=True, auto_add=True) # 添加需要监控的路径和监控的事件
handler = EventHandler() # 事件处理类
notifier = pyinotify.Notifier(monitorObj, handler) # notifier处理
notifier.loop() # 循环处理事件
在简单使用中的EventHandler类需要我们进行定制,实现对事件的特殊处理方法
import pyinotify
multi_event = pyinotify.IN_OPEN | pyinotify.IN_CLOSE_NOWRITE
monitorObj = pyinotify.WatchManager()
class MyEventHandler(pyinotify.ProcessEvent):
def process_IN_OPEN(self,event):
print('OPEN',event.pathname)
def process_IN_CLOSE_NOWRITE(self,event):
print('CLOSE_NOWRITE',event.pathname)
handler = MyEventHandler()
notifier = pyinotify.Notifier(monitorObj ,handler)
monitorObj.add_watch(path,multi_event)
notifier.loop()
以下事件发生的前提都是相关文件处于被监控目录下
事件标志 | 含义 | 其他 |
---|---|---|
IN_ACCESS | 文件被访问 | |
IN_ATTRIB | 文件的一个元数据发生变化 | 包括权限改变,时间戳,扩展属性被修改,链接数变化,所属用户/用户组变化等等 |
IN_CLOSE_NOWRITE | 一个不可写文件被关闭 | |
IN_CLOSE_WRITE | 一个可写文件被关闭 | |
IN_CREATE | 一个文件或目录被创建 | |
IN_DELETE | 一个文件或目录被删除 | |
IN_DELETE_SELF | 被监视的对象本身被删除 | |
IN_DONT_FOLLOW | 如果是符号链接,则不取消引用路径 | |
IN_IGNORED | 当watch被移除时发生 | 用户一般用不到,可用IN_DELETE* 代替 |
IN_ISDIR | 和目录引发的事件有关 | |
IN_MASK_ADD | 更新mask值并不覆盖原值 | |
IN_MODIFY | 一个文件被修改 | |
IN_MOVE_SELF | 被监控的对象本身被移动了 | |
IN_MOVED_FROM | 被监控路径中的一个文件/目录从另一个被监控的路径移动而来 | |
IN_MOVED_TO | 被监控路径中的一个文件/目录移动到另一个被监控的路径 | |
IN_ONLYDIR | 只监控路径如果它只是个目录 | |
IN_OPEN | 一个文件被打开 | |
IN_Q_OVERFLOW | 事件队列溢出 | |
IN_UNMOUNT | when backing fs was unmounted |
https://github.com/seb-m/pyinotify/wik