Linux文件实时同步--inotify + rsync + pyinotify

简介:
   本文介绍下用法、注意事项、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/
   查看内核是否支持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,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
381 5
|
3月前
|
Linux Shell 数据库
Linux文件查找新姿势:总有一种你没见过
【10月更文挑战第18天】文件查找是Linux用户提升工作效率的重要技能。本文介绍了几种实用的文件查找方法,包括基础的`find`命令、快速的`locate`和`mlocate`、高效的`fd`工具、以及结合`grep`和`rg`进行内容搜索。此外,还提供了编写Shell脚本和使用图形界面工具的建议,帮助你更灵活地管理文件。
86 3
|
19天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
53 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
5天前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
54 14
|
4天前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
28 6
|
6天前
|
存储 NoSQL Linux
linux之core文件如何查看和调试
通过设置和生成 core 文件,可以在程序崩溃时获取详细的调试信息。结合 GDB 等调试工具,可以深入分析 core 文件,找到程序崩溃的具体原因,并进行相应的修复。掌握这些调试技巧,对于提高程序的稳定性和可靠性具有重要意义。
43 6
|
2月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
43 5
|
3月前
|
Unix Linux
Linux | Rsync 命令:16 个实际示例(下)
Linux | Rsync 命令:16 个实际示例(下)
50 3
Linux | Rsync 命令:16 个实际示例(下)
|
2月前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
55 6
|
2月前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
123 6