简单了解Python下用于监视文件系统的pyinotify包


Posted in Python onNovember 13, 2015

什么是inotify:

  •   Inotify是一个事件驱动的通知机制,Inotify 提供一个简单的API,使用最小的文件描述符,并且允许细粒度监控。与 inotify 的通信是通过系统调用实现。可用的函数如下所示:
  •   inotify_init  是用于创建一个inotify实例的系统调用,并返回一个指向该实例的文件描述符。
  •   inotify_init1  与inotify_init相似,并带有附加标志。如果这些附加标志没有指定,将采用与inotify_init相同的值。
  •   inotify_add_watch 增加对文件或者目录的监控,并指定需要监控哪些事件。标志用于控制是否将事件添加到已有的监控中,是否只有路径代表一个目录才进行监控,是否要追踪符号链接,是否进行一次性监控,当首次事件出现后就停止监控。
  •   inotify_rm_watch 从监控列表中移出监控项目。
  •   read 读取包含一个或者多个事件信息的缓存。
  •   close 关闭文件描述符,并且移除所有在该描述符上的所有监控。当关于某实例的所有文件描述符都关闭时,资源和下层对象都将释放,以供内核再次使用。

因此,典型的监控程序需要进行如下操作:

  •   使用 inotify_init 打开一个文件描述符
  •   添加一个或者多个监控
  •   等待事件
  •   处理事件,然后返回并等待更多事件
  •   当监控不再活动时,或者接到某个信号之后,关闭文件描述符,清空,然后退出。

pyinotify包的安装

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

Inotify 可以监视的文件系统事件包括:

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)

pyinotify使用例子

#!/usr/bin/env python
# encoding:utf-8
 
import os
from pyinotify import WatchManager, Notifier, \
ProcessEvent,IN_DELETE, IN_CREATE,IN_MODIFY
 
class EventHandler(ProcessEvent):
 """事件处理"""
 def process_IN_CREATE(self, event):
  print  "Create file: %s " %  os.path.join(event.path,event.name)
 
 def process_IN_DELETE(self, event):
  print  "Delete file: %s " %  os.path.join(event.path,event.name)

 def process_IN_MODIFY(self, event):
   print  "Modify file: %s " %  os.path.join(event.path,event.name)
 
def FSMonitor(path='.'):
  wm = WatchManager() 
  mask = IN_DELETE | IN_CREATE |IN_MODIFY
  notifier = Notifier(wm, EventHandler())
  wm.add_watch(path, mask,auto_add=True,rec=True)
  print 'now starting monitor %s'%(path)
  while True:
   try:
     notifier.process_events()
     if notifier.check_events():
       notifier.read_events()
   except KeyboardInterrupt:
     notifier.stop()
     break
 
if __name__ == "__main__":
 FSMonitor('/home/firefoxbug')
Python 相关文章推荐
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
java中的控制结构(if,循环)详解
Jun 26 Python
python开启debug模式的方法
Jun 27 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
python取均匀不重复的随机数方式
Nov 27 Python
使用python3 实现插入数据到mysql
Mar 02 Python
python如何建立全零数组
Jul 19 Python
Django haystack实现全文搜索代码示例
Nov 28 Python
用 Python 元类的特性实现 ORM 框架
May 19 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
Python的pycurl包用法简介
Nov 13 #Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 #Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 #Python
深入解析Python中的urllib2模块
Nov 13 #Python
Python下的常用下载安装工具pip的安装方法
Nov 13 #Python
Python的Flask框架的简介和安装方法
Nov 13 #Python
Python编程入门之Hello World的三种实现方式
Nov 13 #Python
You might like
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
PHP间隔一段时间执行代码的方法
2014/12/02 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jquery自定义属性(类型/属性值)
2013/05/21 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
node.js中的fs.writeSync方法使用说明
2014/12/15 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
2016/07/04 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
layui使用label标签的方法
2019/09/14 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
Openlayers实现点闪烁扩散效果
2020/09/24 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python遍历zip文件输出名称时出现乱码问题的解决方法
2015/04/08 Python
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
Python制作爬虫采集小说
2015/10/25 Python
python中defaultdict的用法详解
2017/06/07 Python
python 删除列表里所有空格项的方法总结
2018/04/18 Python
python最长回文串算法
2018/06/04 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
史上最全面的Java面试题汇总!
2015/02/03 面试题
教你怎样写好自我评价
2013/10/05 职场文书
酒店总经理职务说明书
2014/02/26 职场文书
社区母亲节活动记录
2014/03/06 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
nginx的zabbix 5.0安装部署的方法步骤
2021/07/16 Servers