Python之pyinotify模块的使用

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
posted @ 2020-01-20 17:18  小粉优化大师  阅读(1825)  评论(0编辑  收藏  举报