本文介绍下用法、注意事项、pyinotify多进程实现数据同步
Inotify的出身:
Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么从而能够更好地管理设备,给用户提供更好的服务。inotify 是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知,该机制是著名的桌面搜索引擎项目 beagle 引入的,并在 Gamin 等项目中被应用。
Inotify优点:
之前的一种机制:dnotify有很多缺陷,被监视的目录都会导致过多的文件描述符,对于移动存储设备无法umount;监控对象基于目录,对于文件的变化需要缓存更多的stat结构数据。实现接口使用signal不是很友好;
1、Inotify 不需要对被监视的目标打开文件描述符,而且如果被监视目标在可移动介质上,那么在 umount 该介质上的文件系统后,被监视目标对应的 watch 将被自动删除,并且会产生一个 umount 事件。
2、Inotify 既可以监视文件,也可以监视目录
3、Inotify 使用系统调用而非 SIGIO 来通知文件系统事件。
4、Inotify 使用文件描述符作为接口,因而可以使用通常的文件 I/O 操作select 和 poll 来监视文件系统的变化。
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)
更多原理部分请参考:http://www.ibm.com/developerworks/cn/linux/l-inotifynew/
官网:https://github.com/rvoicilas/inotify-tools/wiki
查看内核是否支持inotify机制
   grep INOTIFY_USER /boot/config-$(uname -r)
   输出:CONFIG_INOTIFY_USER=y 表示支持inotify机制
安装部分:yum install inotify-tools (版本为3.13)
inotify-tools包含两个工具inotifywait(监测事件的发生);inotifywatch(事件变化统计)
使用方法:
可以通过man 解决:man inotifywait;man inotifywatch;man inotify

相关参数设置:
/proc/sys/fs/inotify/max_queued_events 被监测对象的队列最大数(对于较多文件的情况,适当增大)

/proc/sys/fs/inotify/max_user_instances 被监测对象最大数,默认为8192

官方简单脚本举例:
#!/bin/sh  # get the current path  CURPATH=`pwd`  inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \  -e close_write /tmp/test | while read date time dir file; do         FILECHANGE=${dir}${file}         # convert absolute path to relative         FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`         rsync --progress --relative -vrae 'ssh -p 22'  $FILECHANGEREL usernam@example.com:/backup/root/dir && \     echo "At ${time} on ${date}, file $FILECHANGE was backed up via rsync" done

该脚本简单的精妙,但也存在不少不足;
1、脚本执行为单进程,对于含有多个文件的情况需要考虑并发执行
2、wait会产生很多冗余事件;比如对于在文件中写数据,打开文件都会产生临时文件a`或者a.swp  a.swpx 文件,让rsync产生更多的冗余计算;
具体测试文章参考:http://hi.baidu.com/johntech/item/282552cfe6edb735449416e3
3、错误处理机制,脚本出现错误的处理的问题,比如rsync 连接失败,是否隔一段时间重连等?
一款开源工具sersync http://code.google.com/p/sersync/
但为了方便,个人使用了pyinotify 模块实现以上功能:
官方项目地址:https://github.com/seb-m/pyinotify/wiki
代码示例为:

稍后填充!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env python
#encoding=utf8
import os
import subprocess
import time
import sys
from  pyinotify import  WatchManager, Notifier,ProcessEvent,IN_DELETE, IN_CREATE,IN_MODIFY
class rsync_file_cmd():
    def __init__(self,src_file,dst,dst_file):
        self.src_file=src_file
        self.dst=dst
        self.dst_file=dst_file
        self.cmd='rsync -arz --timeout=60 -e "ssh -p 22" %s %s:%s' %(self.src_file,self.dst,self.dst_file)
        self.del_cmd='ssh -p 22  %s "rm -rf %s"' % (self.dst,self.dst_file)
class EventHandler(ProcessEvent):
    """Handle"""
    def process_IN_CREATE(self, event):
        if event.name.startswith('.'or event.name.endswith('~'or event.name=='4913':
            pass
        else:
            create_sync=rsync_file_cmd(str(event.pathname),'root@198.72.107.18',str(event.pathname))
            subprocess.call(create_sync.cmd,shell=True)
    def process_IN_DELETE(self, event):
        if event.name.startswith('.'or event.name.endswith('~'or event.name=='4913':
            pass
        else:
            delete_sync=rsync_file_cmd(str(event.pathname),'root@198.72.107.18',str(event.pathname))
            subprocess.call(delete_sync.del_cmd,shell=True)
    def process_IN_MODIFY(self, event):
        if event.name.startswith('.'or event.name.endswith('~'or event.name=='4913':
            pass
        else:
            modify_sync=rsync_file_cmd(str(event.pathname),'root@198.72.107.18',str(event.pathname))
            subprocess.call(modify_sync.cmd,shell=True)
def FSMonitor(path='/root/wpf'):
        wm = WatchManager()
        mask = IN_DELETE | IN_MODIFY | IN_CREATE
        notifier = Notifier(wm, EventHandler(),read_freq=10)
        notifier.coalesce_events()
        # 设置受监视的事件,这里只监视文件创建事件,(rec=True, auto_add=True)为递归处理
        wm.add_watch(path,mask,rec=True, auto_add=True)
        notifier.loop()
if __name__=='__main__':
    try:
        pid = os.fork()
        if pid > 0:
            sys.exit(0)
    except OSError, e:
        print >>sys.stderr, 'fork failed: %d (%s)' % (e.errno, e.strerror)
        sys.exit(1)
    os.setsid()
    os.umask(0)
    FSMonitor()
    print 'start!'
本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1195019,如需转载请自行联系原作者

Linux文件实时同步--inotify + rsync + pyinotify相关推荐

  1. Linux下实现文件实时同步(rsync命令+rsync作为服务+xinetd托管rsync)

    文章目录 一.rsync概念 1. 什么是rsync 2. rsync的特点 3. rsync和scp的区别 二.rsync用法 1. 基本语法 2. 本机同步 1) -R(保留相对路径) 2)- - ...

  2. Inotify+Rsync实现linux文件实时同步

    公司一套系统的同步使用的donotify,不能实现子目录的实时同步,通过查资料,发现inotify可以实现子目录的实时同步,以下为笔记. 一.介绍 Inotify 是文件系统事件监控机制,作为 dno ...

  3. linux文件同步方法,inotify + rsync实现linux文件实时同步

    一.项目需求:服务器A的数据目录内容变化后,改变要实时更新到多台服务器B C 的相关目录. 二.解决方法: 1.多台服务器做为rsync服务器端,服务器A做为rsync客户端,使用rsync命令同步数 ...

  4. rsync+sersync实现数据文件实时同步

    rsync+sersync实现数据文件实时同步 使用rsync+sersync,实现nfs与backup服务器间实时数据同步 一.数据同步工具介绍 rsync是一款开源的.快速的.多功能的.可实现全量 ...

  5. 【Linux下Inotify + Rsync文件实时同步】

    Linux下Inotify + Rsync文件实时同步 一.使用前言* 随着公司业务的发展,单web服务器不能满足用户的访问,需要增加多台web服务器实现均衡高可用性访问.为了统一各web服务器之间的 ...

  6. inotify用法简介及结合rsync实现主机间的文件实时同步

    一.inotify简介 inotify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系 ...

  7. MySQL :rsync+sersync文件实时同步

    文章目录 1. rsync是什么 rsync+sersync文件实时同步 一:环境 二:备份服务器操作 三:数据源服务器操作 安装rsync客户端软件 安装sersync工具,实时触发rsync进行同 ...

  8. Linux与Windows之间实现文件实时同步的方案

    记linux与Windows之间实现文件实时同步的方案 近日,数据分析部提了个需求说要让一台linux的机器上的文件同步到一台Windows机器的某个目录下,由于本姑娘从来没有碰到过这种问题,于是上网 ...

  9. linux间文件实时同步(syncthing) ---带历史版本“后悔药”

    一.概念简介 syncthing 一款开源免费的数据同步工具,基于P2P的跨平台文件同步工具,通过tcp建立设备连接,再通过TLS进行数据安全传输,支持公网与局域网搭建.支持单双向同步与历史版本控制- ...

最新文章

  1. QT的QDial类的使用
  2. oracle 数据库中拆分,oracle数据库字符串拆分
  3. idea报错 电脑死机蓝屏
  4. 老板不相信我的方案结论!怎么让数据分析驱动决策?
  5. ENVI下Landsat8辐射定标与大气校正
  6. php hprose扩展1.5.5,基于Hprose for PHP 1.5.6、Yii2.0.7的RPC的基本实现流程
  7. mount: unknown filesystem type
  8. 2007年“网络十大炒女”排行榜
  9. Windows下pig-0.17启动时遇到的问题及解决
  10. 预产期计算器在线计算生男生女计算机,预产期计算器生男生女在线查询-预产期计算器及天数计算时间软件2017版-腾牛安卓网...
  11. 2021年西式面点师(中级)新版试题及西式面点师(中级)模拟试题
  12. 求职-平安产险科技一二面
  13. 我要大学答案-大学生都在用的小程序 课后习题答案|实验报告|考研资料|期末真题~
  14. JAVA实现zip压缩/解压缩
  15. UV-LED紫外消毒灯可以有效灭杀气溶胶中附着的新冠病毒
  16. windows bitlocker 控制台加密、解密脚本
  17. 三大受欢迎的免费开源CMS建站系统
  18. webservice小解
  19. 电脑桌面两个计算机图标怎么删除,电脑声音图标怎么有两个,怎么除掉一个
  20. 【课后习题】高等数学第七版上第三章 微分中值定理与导数的应用 第二节 洛必达法则

热门文章

  1. Linux下安装Foxit Reader
  2. 转移指令的原理03 - 零基础入门学习汇编语言45
  3. linux查看网卡物理编号_Linux下多网卡时,如何快速辨别网卡ID与物理网卡的对应关系(即ethtool命令)...
  4. ORACAL去除表中null转化为0
  5. coc跑团san数值规则_为什么B站上有些coc跑团7版规则san值四五十,但是掉的时候只是掉1D3,是不是应该是20上限?...
  6. sql怎么实现取当前数据以及累计7天数据_年薪60万+大佬吐血整理字节跳动大数据面试真题...
  7. Swift3.0语言教程查找字符集和子字符串
  8. python基础教程博客_python基础教程(一)
  9. python 生成器_Python生成器的用法
  10. 自定义的代码块怎么移到别的电脑上