天天看點

python監控檔案變化-----pyinotify

概述

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源碼