一,inotify-tools 简介
inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13开始引入,允许监控程序打开一个独立文件描述符,并针对事件集监控一个或者多个文件,例如打开、关闭、移动/重命名、删除、创建或者改变属性。
inotify-tools是为linux下inotify文件监控工具提供的一套C的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。
rsync + inotify 用来实时同步数据,一般用于 NFS 的热备。
二,配置 rsync+ inotify
1,配置 rsync 服务端
# useradd rsync -r -s /sbin/nologin -M # id rsync # mkdir /backup #创建备份目录 # chown -R rsync:rsync /backup/
下面是创建配置文件,如有不明确的,可以查看 使用rsync同步文件。
[root@aliyun ~]# cat /etc/rsyncd.conf # Global Settings # port = 873 端口号默认为873,可以不指定 uid = rsync gid = rsync use chroot = no max connections = 5 timeout = 600 strict modes = yes pid file = /var/run/rsyncd.pid lock file = /var/run/rsyncd.lock log file = /var/log/rsyncd.log secrets file = /etc/rsyncd.passwd auth users = feiyu [backup] path = /backup ignore errors = yes read only = no write only = no hosts allow = 115.28.48.187 hosts deny = * list = false uid = root gid = root auth users = feiyu secrets file = /etc/rsyncd.passwd ignore errors = yes # echo "feiyu:123" > /etc/rsyncd.passwd #创建密码文件 # chmod 600 /etc/rsyncd.passwd # rsync --deamon # echo "rsync --daemon" >> /etc/rc.local #加入开机启动,放在/etc/rc.local 的目的是方便管理各服务
2,配置客户端
[root@sta2 ~]# echo "123" >> /etc/rsyncd.passwd #只需要密码,传送时已指定好了用户 [root@sta2 ~]# chmod 600 /etc/rsyncd.passwd
下载 inotify-tools ,此源码包放在 google code上,可以在我的ftp上下载,http://mirrors.tianfeiyu.com/inotify-tools/inotify-tools-3.14.tar.gz
# wget http://mirrors.tianfeiyu.com/inotify-tools/inotify-tools-3.14.tar.gz # tar xf inotify-tools-3.14 -C /usr/local/inotify-tools-3.14/ # ln -s inotify-tools-3.14 inotify # cd /usr/local/inotify/bin/
inotifywait 用法示例:
inotifywait用于等待文件或文件集上的一个待定事件,可以监控任何文件和目录设置,并且可以递归地监控整个目录树;
inotifywatch用于收集被监控的文件系统计数据,包括每个inotify事件发生多少次等信息
从上面可知inotifywait是一个监控事件,可以配合shell脚本使用它。与它相关的参数:
语法格式:inotifywait [-hcmrq][-e][-t][–format][-timefmt][…]
-m: 即“–monitor” 表示始终保持事件监听状态。
-r: 即“–recursive” 表示递归查询目录
-q: 即“–quiet” 表示打印出监控事件
-o: 即“–outfile” 输出事情到一个文件而不是标准输出
-s: 即“–syslog” 输入错误信息到系统日志
-e: 即“–event”, 通过此参数可以指定要监控的事件,常见的事件有modify、delete、create、close_write、move、close、unmount和attrib等
-format: 指定输出格式;常用的格式符如:%w:表示发生事件的目录 %f:表示发生事件的文件 %e:表示发生的事件 %T:使用由-timefmt定义的时间格式
-timefmt:指定时间格式,用于-format选项中的%T格式
–exclude
–fromfile:从文件中读取需要监控的文件或排除的文件,一个文件一行,排除的文件以”@”开头,不支持正则
inotifywatch是收集数据的指令,它的相关参数:
语法格式:inotifywatch[-hvzrqf][-e][-t][-a][-d][…]
-fromfile:从文件中读取需要监控的文件或排除的文件,一个文件一行,排除的文件以”@”开头
-z: 即“-zero” 输出表格的行和列,即使元素为空
-r: 即“-recursive” 监视一个目录下的所有子目录
-t: 即“-timeout” 设置超时时间
-e: 即“-event” 只监听指定的事件
运行结果如下:
# ./inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create,close_write,delete /tmp #监控/tmp文件夹下文件的增删改操作
3,自定义脚本使用 inotifywait 监控要同步的目录并使用 rsync 进行同步
#!/bin/bash remote_user=feiyu remote_ip=114.215.91.78 #rsync服务端 remote_module=backup #rsync服务端模块,与rsync配置文件中的保持一致 inotify=/usr/local/inotify/bin/inotifywait mon_dir_tianfeiyu=/usr/html/htdocs rsync_passwd=/etc/rsyncd.passwd #检查文件夹下若有文件改变则立即同步 $inotify -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e \ create,close_write,delete ${mon_dir_tianfeiyu} | while read file;do rsync -az --delete ${mon_dir_tianfeiyu} $remote_user@$remote_ip::$remote_module \ --password-file=${rsync_passwd} done
然后让脚本运行在后台,就可以实时同步了:
# setsid sh tianfeiyu_inotify.sh &