inotify + rsync实现linux文…

 作者:陶春雷
 
一、介绍
Inotify  是文件系统事件监控机制,作为  dnotify  的有效替代。dnotify  是较早内核支持的文件监控机制。Inotify  是一种强大的、细粒度的、异步的机制,它满足各种各样的文件监控需要,不仅限于安全和性能。
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)
注:上面所说的文件也包括目录。 
二、为能在shell下使用inotify特性,需要安装inotify-tools
1、inotify-tools:The  general  purpose  of  this  package  is  to  allow  inotify's  features  to  be  used  from  within  shell  scripts.
下载地址:http://inotify-tools.sourceforge.net/
编译安装
./configure
make
make  install
完成后,注意查看manpage,man  inotify  、  man  inotifywait
inotifywait  仅执行阻塞,等待  inotify  事件。您可以监控任何一组文件和目录,或监控整个目录树(目录、子目录、子目录的子目录等等)。在  shell  脚本中使用  inotifywait。
inotifywatch  收集关于被监视的文件系统的统计数据,包括每个  inotify  事件发生多少次。
2、inotify的系统相关参数:
  /proc  interfaces
              The  following  interfaces  can  be  used  to  limit  the  amount  of  kernel  memory  consumed  by  inotify:
              /proc/sys/fs/inotify/max_queued_events
                            The  value  in  this  file  is  used  when  an  application  calls  inotify_init(2)  to  set  an  upper    limit    on    the  number    of    events    that    can  be  queued  to  the  corresponding  inotify  instance.    Events  in  excess  of  this  limit  are  dropped,  but  an  IN_Q_OVERFLOW  event  is  always  generated.
              /proc/sys/fs/inotify/max_user_instances
                            This  specifies  an  upper  limit  on  the  number  of  inotify  instances  that  can  be  created  per  real  user  ID.
              /proc/sys/fs/inotify/max_user_watches
                            This  specifies  limit  on  the  number  of  watches  that  can  be  associated  with  each  inotify  instance.
3、inotifywait  相关的参数(更多,查看manpage):
inotifywait
This  command  simply  blocks  for  inotify  events,  making  it  appropriate  for  use  in  shell  scripts.  It  can  watch  any  set  of  files  and  directories,  and  can  recursively  watch  entire  directory  trees.
-m,  --monitor
                            Instead    of    exiting    after  receiving  single  event,  execute  indefinitely.    The  default  behaviour  is  to  exit  after  the  first  event  occurs.
-r,  --recursive
                            Watch  all  subdirectories  of  any  directories  passed  as  arguments.    Watches  will  be  set  up  recursively    to  an    unlimited    depth.      Symbolic    links    are    not 
traversed.    Newly  created  subdirectories  will  also  be  watched.
-q,  --quiet
                            If  specified  once,  the  program  will  be  less  verbose.    Specifically,  it  will  not  state  when  it    has    completed  establishing  all  inotify  watches.
  -e  <event>,  --event  <event>
                            Listen  for  specific  event(s)  only.    The  events  which  can  be  listened  for  are  listed  in  the    EVENTS    section.    This  option  can  be  specified  more  than  once.    If  omitted,  all  events  are  listened  for.  use“,”separate  multi  events
三、使用
1.查看是否支持inotify,从kernel  2.6.13开始正式并入内核,RHEL5已经支持。
看看是否有  /proc/sys/fs/inotify/目录,以确定内核是否支持inotify
[root@RHEL5  Rsync]#  ll  /proc/sys/fs/inotify
total  0
-rw-r--r--  root  root  Oct    09:36  max_queued_events
-rw-r--r--  root  root  Oct    09:36  max_user_instances
-rw-r--r--  root  root  Oct    09:36  max_user_watches
2.关于递归:
inotifywait
This  command  simply  blocks  for  inotify  events,  making  it  appropriate  for  use  in  shell  scripts.  It  can  watch  any  set  of  files  and  directories,  and  can  recursively  watch  entire  directory  trees.
3.使用:
#!/bin/sh
src=/opt/webmail
des=/tmp
ip=192.168.7.192
/usr/local/bin/inotifywait  -mrq  --timefmt  '%Y%m%d-%H:%M'  --format    '%T  %e  %w%f' 
  -e  CLOSE_WRITE,delete,create,attrib 
${src} 
while  read    file
                do
                                rsync  -avz  --delete  --progress  ${src}  root@${ip}:${des}  &&
                                echo  "${src}  was  rsynced"
                                echo  "---------------------------------------------------------------------------"
                done
注:
当要排出同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径。详细查看man  rsync
当要排除都某个目录的事件监控的处理时,为inotifywait添加--exclude或--excludei参数。详细查看man  inotifywait
另:
/usr/local/bin/inotifywait  -mrq  --timefmt  '%Y%m%d-%H:%M'  --format    '%T  %e  %w%f' 
  -e  CLOSE_WRITE,delete,create,attrib 
${src} 
上面的命令返回的值类似于:
10/03/09  15:31  /wwwpic/1
这3个返回值做为参数传给read,关于此处,有人是这样写的:
inotifywait  -mrq  -e  create,move,delete,CLOSE_WRITE  $SRC  while  read  F;do
细化了返回值。
注:要取得监控文件发生的事件,在--format处指定%e参数,同时,使用--event参数来指定要监控的事件即可,如--format    '%T  %w%f  %e'  --event  modify,delete,create,attrib
说明: 当文件系统发现指定目录下有如上的条件的时候就触发相应的指令,是一种主动告之的而非我用循环比较目录下的文件的异动,该程序在运行时,更改目录内的文件时系统内核会发送一个信号,这个信号会触发运行rsync命令,这时会同步源目录和目标目录。
--timefmt:指定输出时的输出格式
    --format:    '%T  %w%f'指定输出的格式,上面的输出类似于:12/10/08  06:34  /opt/webmail/dovecot-1.1.2/src/test/1
小脚本,同步到多台主机:
  文件:  inotify_rsync.tar.gz 
大小:  1KB 
下载:  下载 
 
更改后,更简单,适用于同步到相同的目录,监控多目录,多文件,同步到多台服务器
#!/bin/sh
#set  -x
#var 
src="/usr/local/nginx/html/lib  /usr/local/nginx/html/www  /usr/local/nginx/html/var/www.work.com.conf.php"
des_ip="172.18.1.35  172.18.1.36  172.18.1.37  172.18.1.38"
#function
inotify_fun  ()
{
/usr/local/bin/inotifywait  -mrq  --timefmt  '%Y%m%d-%H:%M'  --format  '%T  %e  %w%f' 
-e  CLOSE_WRITE,delete,create,move  $1|while  read  time  file
do
for  ip  in  $des_ip
do
echo  "`date  +%Y%m%d-%T`:  rsync  -avzq  --delete  --progress  $1  $ip:`dirname  $1`"
rsync  -avzq  --delete  --progress  $1  $ip:`dirname  $1`
echo
done
done
}
#main
for  in  $src
do
inotify_fun  $a 
 
done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值