注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

simonzhang个人观点

http://www.simonzhang.net 镜像地址

 
 
 

日志

 
 

pyinotify监控文件和文件夹变化  

2011-09-28 23:15:45|  分类: python备忘 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
【2011-9-28 张子萌】

          之前写了脚本,死循环调用inotifywait监控文件夹,如果文件有变动,则启动

rsync进行同步。但是当前需求有点变化,文件要按照日期建文件夹进行存储,

且文件变化很快,如果直接监控最顶级目录系统资源将消耗很大,所以考虑还是自

写一下好,如果系统资源量变化大,且不用时时同步时可以根据文件变动对变动

对文件进行记录,可以按照优先规则进行同步。

 

    官方网站 : http://trac.dbzteam.org/pyinotify

 

    系统要求:Linux kernel with inotify 2.6.13

              Python 2.4

 

    直接使用easy_install安装非常简单

    # sudo easy_install pyinotify

    如果不能联网,则需要直接下载压缩包,进行编译安装。

 

    首先测试下是否可用:

    使用以下命令监控/tmp文件夹,

    # python -m pyinotify /tmp

    /tmp文件夹下新建1.txt,并随后进行删除。看到显示的记录如下:

<Event dir=False mask=0x100 maskname=IN_CREATE name=1.txt path=/tmp pathname=/tmp/1.txt wd=1 >

<Event dir=False mask=0x20 maskname=IN_OPEN name=1.txt path=/tmp pathname=/tmp/1.txt wd=1 >

<Event dir=False mask=0x4 maskname=IN_ATTRIB name=1.txt path=/tmp pathname=/tmp/1.txt wd=1 >

<Event dir=False mask=0x8 maskname=IN_CLOSE_WRITE name=1.txt path=/tmp pathname=/tmp/1.txt wd=1 >

<Event dir=True mask=0x40000020 maskname=IN_OPEN|IN_ISDIR name='' path=/tmp pathname=/tmp wd=1 >

<Event dir=True mask=0x40000010 maskname=IN_CLOSE_NOWRITE|IN_ISDIR name='' path=/tmp pathname=/tmp wd=1 >

<Event dir=False mask=0x200 maskname=IN_DELETE name=1.txt path=/tmp pathname=/tmp/1.txt wd=1 >

 

    效果不错,继续向下进行。只要有创建、删除和关闭写就打印出变化的文件或目录,代码如下:

import  re

import pyinotify

 

wm = pyinotify.WatchManager()

mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE | pyinotify.IN_CLOSE_WRITE

 

class EventHandler(pyinotify.ProcessEvent):

    def process_IN_CREATE(self, event):

        self.rebuild(event)

 

    def process_IN_DELETE(self, event):

        self.rebuild(event)

 

    def process_IN_CLOSE_WRITE(self, event):

        self.rebuild(event)

 

    def rebuild(self, event):

        chang_name=re.compile(".+\.swp$|.+\.swx$|.+\.swpx$")

        if not chang_name.match(event.pathname):

            print event.pathname

 

handler = EventHandler()

notifier = pyinotify.Notifier(wm, handler)

wdd = wm.add_watch('/tmp', mask, rec=True,auto_add=True )

 

notifier.loop()

 

    代码里使用正则表达式过滤因为使用vim打开文件产生的缓存文件。也可以用exclude_filter方法

在官方文档中例子如下,但是我测试多次没有成功,所以直接用正则过滤。

 

# Exclude patterns from list

excl_lst = ['^/etc/apache[2]?/',

            '^/etc/rc.*',

            '^/etc/hostname',

            '^/etc/hosts',

            '^/etc/(fs|m)tab',

            '^/etc/cron\..*']

excl = pyinotify.ExcludeFilter(excl_lst)

# Add watches

res = wm.add_watch(['/etc/hostname', '/etc/cups', '/etc/rc0.d'],

                   pyinotify.ALL_EVENTS, rec=True, exclude_filter=excl)

  

    如果监控文件太多,需要对系统做一下修改sysctl -n -w fs.inotify.max_user_watches=16384

  评论这张
 
阅读(4291)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017