inotify提供的事件表
IN_ACCESS # 文件被读取
IN_MODIFY # 文件被修改
IN_ATTRIB # 元数据被修改
IN_CLOSE_WRITE # 打开且等待写入的文件或目录被关闭
IN_CLOSE_NOWRITE # 只读方式打开文件或目录被关闭
IN_OPEN # 文件或目录被打开
IN_MOVED_FROM # 监控的目录中的条目被移出监控区域
IN_MOVED_TO # 目录或文件被移入监控区域
IN_CREATE # 在被监控目录中创建了子目录或文件
IN_DELETE # 被监控目录中有子目录或文件被删除
IN_CLOSE # 文件被关闭,等同于IN_CLOSE_WRITE
IN_MOVED # 文件被移动,等同于IN_MOVED_FROM
1、pyinotify的作用
pyinotify是一个Python模块,用来监测文件系统的变化。pyinotify依赖于Linux内核inotify功能。inotify是一个事件驱动的通知器,其通知接口从内核空间到用户空间通过三个系统调用。
pyinotify结合这些系统调用,并提供一个顶级的抽象和一个通用的方式来处理这些功能
注意:
只有在Linux内核2.6.13以后支持inotify的功能
2、pyinotify模块的安装
pip3 install pyinotify
3、安装完成后,测试是否能正常使用
#开启监控/tmp目录的变化
[root@python-mysql ~]# python3 -m pyinotify /tmp
#在tmp目录,创建一个文件
[root@python-mysql ~]# touch /tmp/test
#此时事件已经触发,证明inotify功能是生效,可用的
[root@python-mysql ~]# python3 -m pyinotify /tmp
<Event dir=False mask=0x100 maskname=IN_CREATE name=test path=/tmp pathname=/tmp/test wd=1 >
<Event dir=False mask=0x20 maskname=IN_OPEN name=test path=/tmp pathname=/tmp/test wd=1 >
<Event dir=False mask=0x4 maskname=IN_ATTRIB name=test path=/tmp pathname=/tmp/test wd=1 >
<Event dir=False mask=0x8 maskname=IN_CLOSE_WRITE name=test path=/tmp pathname=/tmp/test wd=1 >
4、监听指定目录所有的事件
import pyinotify
wm = pyinotify.WatchManager()
wm.add_watch('/tmp',pyinotify.ALL_EVENTS)
notifier = pyinotify.Notifier(wm)
notifier.loop()
运行效果
#发出一个对tmp目录的删除事件
[root@python-mysql ~]# rm -f /tmp/test
[root@python-mysql ~]# python3 test.py
<Event dir=False mask=0x200 maskname=IN_DELETE name=test path=/tmp pathname=/tmp/test wd=1 >
5、监控目录的创建与删除事件的示例
import pyinotify
wm = pyinotify.WatchManager()
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE
wm.add_watch('/tmp',mask)
notifier = pyinotify.Notifier(wm)
运行效果
#在tmp目录创建与删除
[root@python-mysql ~]# touch /tmp/cyc
[root@python-mysql ~]# rm -f /tmp/cyc
[root@python-mysql ~]# python3 test.py
<Event dir=False mask=0x100 maskname=IN_CREATE name=cyc path=/tmp pathname=/tmp/cyc wd=1 >
<Event dir=False mask=0x200 maskname=IN_DELETE name=cyc path=/tmp pathname=/tmp/cyc wd=1 >
6、监控目录的创建与删除事件并且对事件的处理的示例
import pyinotify
wm = pyinotify.WatchManager()
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE
class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self,event):
print("监控新创建目录逻辑处理 路径名字:%s" % event.pathname)
def process_IN_DELETE(self,event):
print("监控删除目录逻辑处理 路径名字:%s" % event.pathname)
wm.add_watch('/tmp',mask)
handler = EventHandler()
notifier = pyinotify.Notifier(wm,handler)
notifier.loop()
运行效果
#对tmp目录进行创建,删除
[root@python-mysql ~]# touch /tmp/cyc
[root@python-mysql ~]# rm -f /tmp/cyc
[root@python-mysql ~]# python3 test.py
监控新创建目录逻辑处理 路径名字:/tmp/cyc
监控删除目录逻辑处理 路径名字:/tmp/cyc