当前位置: 首页 > 工具软件 > Pyinotify > 使用案例 >

python监控文件变化-----pyinotify

商和雅
2023-12-01

概述

Pyinotify可以用来监测文件系统的变化, 它依赖于Linux内核的功能—inotify(内核2.6.13合并)。 inotify的是一个事件驱动的通知器,其通知接口通过三个系统调用从内核空间到用户空间。

inotify有以下特点

  1. 通知配置文件的改变
  2. 跟踪某些关键的系统文件的变化
  3. 监控某个分区磁盘的整体使用情况
  4. 系统崩溃时进行自动清理
  5. 自动触发备份进程
  6. 向服务器上传文件结束时发出通知

安装

# 方式一 
pip install pyinotify

# 方式二

git clone https://github.com/seb-m/pyinotify.git
cd pyinotify/
python setup.py install


事件说明

 --IN_ACCESS,即文件被访问 
--IN_MODIFY,文件被write 
--IN_ATTRIB,文件属性被修改,如chmod、chown、touch等 
--IN_CLOSE_WRITE,可写文件被close 
--IN_CLOSE_NOWRITE,不可写文件被close 
--IN_OPEN,文件被open 
--IN_MOVED_FROM,文件被移走,如mv 
--IN_MOVED_TO,文件被移来,如mv、cp 
--IN_CREATE,创建新文件 
--IN_DELETE,文件被删除,如rm 
--IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己 
--IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己 
--IN_UNMOUNT,宿主文件系统被umount 
--IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) 
--IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO) 

代码实现

import pyinotify


class MyEventHandler(pyinotify.ProcessEvent):

    def process_IN_ACCESS(self, event):
        """
        文件被访问
        :param event:
       :return:
        """
        print("件被访问:  ", event.pathname)

    def process_IN_ATTRIB(self, event):
        """
        文件属性被修改,如chmod、chown、touch等
        :param event:
        :return:
        """
        print("文件属性被修改:", event.pathname)

    def process_IN_CLOSE_NOWRITE(self, event):
        """
        不可写文件被close
        :param event:
        :return:
        """
        print("不可写文件被close event:", event.pathname)


    def process_IN_CLOSE_WRITE(self, event):
        """
        可写文件被close
        :param event:
        :return: rsync -av /etc/passwd  192.168.204.168:/tmp/passwd.txt
        """
        print("可写文件被close:", event.pathname)


    def process_IN_CREATE(self, event):
        """
        创建新文件
        :param event:
        :return:
        """
        print("创建新文件:", event.pathname)


    def process_IN_DELETE(self, event):
        """
        文件被删除
        :param event:
        :return:
        """
        print("文件被删除:", event.pathname)


    def process_IN_MODIFY(self, event):
        """
        文件被修改
        :param event:
        :return:
        """
        print("文件被修改:", event.pathname)


    def process_IN_OPEN(self, event):
        """
         文件被打开
        :param event:
        :return:
        """
        print("OPEN event:", event.pathname)

if __name__ == '__main__':
    monitor_obj = pyinotify.WatchManager()
    # path监控的目录
    monitor_obj.add_watch(path, pyinotify.ALL_EVENTS, rec=True)
    
    # event handler
    event_handler= MyEventHandler()

    # notifier
    monitor_loop= pyinotify.Notifier(monitor_obj, event_handler)
    monitor_loop.loop()

 

 

学习链接

pyinotify----Github

Shell 监控文件变化

pyinotify源码

 类似资料: