概述
Pyinotify可以用來監測檔案系統的變化, 它依賴于Linux核心的功能—inotify(核心2.6.13合并)。 inotify的是一個事件驅動的通知器,其通知接口通過三個系統調用從核心空間到使用者空間。
inotify有以下特點
- 通知配置檔案的改變
- 跟蹤某些關鍵的系統檔案的變化
- 監控某個分區磁盤的整體使用情況
- 系統崩潰時進行自動清理
- 自動觸發備份程序
- 向伺服器上傳檔案結束時發出通知
安裝
# 方式一
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源碼