【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,并随后进行删除。看到显示的记录如下:
效果不错,继续向下进行。只要有创建、删除和关闭写就打印出变化的文件或目录,代码如下:
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’,
&nb
sp; ‘^/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。
发表评论