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()