一、Inotify介绍
Inotify是一种强大的,细粒度的。异步的文件系统事件监控机制,linux内核从2.6.13起,加入了 Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 正是实施这样监控的软件。国人周洋在金山公司也开发了类似的实时同步软件sersync,克服了inotify的缺陷,并且提供了几个插件作为可选工具。
inotify的实现工具有几款软件:
inotify-tools,sersync,lrsyncd
二、安装inotify-tools
inotify由inotify-tools包提供。在安装inotify-tools之前,请确保内核版本高于2.6.13,且在/proc/sys/fs/inotify目录下有以下三项,这表示系统支持inotify监控。
[root@web01 ~]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Nov 10 09:44 max_queued_events
-rw-r--r-- 1 root root 0 Nov 10 09:44 max_user_instances
-rw-r--r-- 1 root root 0 Nov 10 09:44 max_user_watches
inotify-tools工具只提供了两个命令:
[root@web01 ~]# rpm -ql inotify-tools | grep bin/
/usr/bin/inotifywait
/usr/bin/inotifywatch
其中inotifywait命令用于等待文件发生变化,所以可以实现监控(watch)的功能,该命令是inotify的核心命令。inotifywatch用于收集文件系统的统计数据,例如发生了多少次inotify事件,某文件被访问了多少次等等,一般用不上。
三、inotify相关内核参数
文件 | 默认值 | 作用说明 |
max_user_watches | 8192 | 设置inotifywait或inotifywatch命令可以监视的文件数量(单进程) |
max_user_instances | 128 | 设置每个用户可以运行的inotifywait或inotifywatch命令的进程数 |
max_queued_events | 16384 | 设置inotify实例事件(event)队列可容纳的事件数量 |
可以调大三个文件的数值,使监听范围更大
如:
[root@web01~]#echo 30000 >/proc/sys/fs/inotify/max_user_watches
四、inotifywait命令参数说明
参数 | 含义 |
-m, --monitor (重要参数) | 始终保持事件监听。 |
-d, --daemon | 111 |
-r, --recursive (重要参数) | 递归监控目录数据信息变化 |
-o, --outfile <file> | 打印事件到文件中,相当于标准正确输出 |
-s, --syslog | 发送错误到syslog相当于标准错误输出 |
-q, --quiet (重要参数) | 输出信息少(只打印事件信息) |
--exclude <pattern> | 排除文件或目录 |
--excludei <pattern> | 排除文件或目录时,不区分大小写 |
--timefmt <fmt> (重要参数) | 指定时间输出格式 |
--format <fmt> (重要参数) | 打印使用指定的输出类似格式字符串;即实际监控输出内容 |
-e (重要参数) | 指定监听指定的事件,如果省略,表示所有事件都进行监听 |
4.1 inotifywait 参数 --format <fmt>格式定义参数
命令参数 | 参数说明 |
%w | 事件出现时,监控文件或目录的名称信息 |
%f | 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空 |
%e | 显示发生的事件信息,不同的事件信息用逗号进行分隔 |
%Xe | 显示发生的事件名称,不同的事件信息有X进行分隔,可以修改X为指定分隔符 |
%T | 以"--timefmt"定义的时间格式输出当前时间,要求同时定义"--timefmt"
|
4.2 inotifywait 参数--timefmt <fmt>时间格式参数
命令参数 | 参数说明 |
%d(重要参数) | 每月的第几天,显示倍息为十进制数(范围是 01-31 ) |
%m(重要参数) | 显示月份,显示信息为十进制(范围 01-12 ) |
%M | 显示分钟,显示信息为十进制(范围 00-59 ) |
%y(重要参数) | 年份信息,显示信息为十进制,并且没有世纪信息 |
%Y | 年份信息,显示信息为十进制,并且包含世纪信息 |
%H | 小时信息,显示信息为十进制,使用 24小时制(范围 00-23 ) |
4.3 -e[参数] 可以指定的事件类型
事件名称 | 事件说明 |
access | 文件或目录内容被读取 |
modify | 文件或目录内容被写入 |
attrib | 文件或目录属性改变 |
close_write (重要参数) | 文件或目录关闭,在写入模式打开之后关闭的。 |
close_nowrite | 文件或目录关闭,在只读模式打开之后关闭的 |
close | 文件或目录关闭,不管读或是写模式 |
open | 文件或目录被打开 |
moved_to 拉 | 文件或目录被移动到监控的目录中 |
moved_from 推 | 文件或目录被移出从监控的目录中 |
move (重要参数) | 文件或目录不管移动到或是移出监控目录都触发事件 |
create (重要参数) | 文件或目录创建在监控目录中 |
delete (重要参数) | 文件或目录被删除在监控目录中 |
delete_self | 文件或目录被删除,目录本身被删除 |
unmount | 挂载在被监控目录上的文件系统被umount,umount后不再监控此目录 |
isdir | 监控目录先关操作 |
五、示例
inotifywait监控中的事件测试:
首先创建一个目录:
[root@web01 ~]# mkdir /data
在xshell中再打开一个会话进行创建文件操作,一个会话进行前台监控,一个会话进行文件操作
1.创建事件
[root@web01 data]# touch 1.txt
[root@web01 data]# inotifywait -mrq /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e create
10-11-18 12:31 /data/1.txt 事件信息: CREATE
2.删除事件
[root@web01 data]# rm -rf 1.txt
[root@web01 data]# inotifywait -mrq /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e delete
10-11-18 12:42 /data/1.txt 事件信息: DELETE
3.修改事件
[root@web01 data]# echo "123" > 1.txt
[root@web01 data]# inotifywait -mrq /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e close_write
10-11-18 12:44 /data/1.txt 事件信息: CLOSE_WRITE,CLOSE
4.移动事件
[root@web01 data]# mv /etc/hosts ./
[root@web01 data]# inotifywait -mrq /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_to
10-11-18 12:47 /data/hosts 事件信息: MOVED_TO
[root@web01 data]# mv 2.txt /tmp/
[root@web01 data]# inotifywait -mrq /data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件信息: %e" -e moved_from
10-11-18 12:49 /data/2.txt 事件信息: MOVED_FROM
六、inotify+rsync实时同步服务部署
rsync服务端部署
1.查看软件是否存在
[root@web02 ~]# rpm -qa | grep rsync
rsync-3.0.6-12.el6.x86_64
2.进行rsync服务配置
[root@web02 ~]# vim /etc/rsyncd.conf
uid = rsync
gid = rsync
use chroot = no
max connections = 200
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
hosts allow = 192.168.231.142
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup1]
comment = "test"
path = /backup/test1
[backup2]
comment = "test2"
path = /backup/test2
3.创建rsync管理用户
[root@web02 ~]# useradd -s /sbin/nologin -M rsync
4.创建认证用户密码文件并授权
[root@web02 ~]# echo "reync_backup:123456" > /etc/rsync.password
[root@web02 ~]# chmod 600 /etc/rsync.password
5.创建备份目录,修改属主属组
[root@web02 ~]# mkdir -p /backup/{test1,test2}
chmod -R rsync.rsync /backup/
6.启动rsync服务
[root@web02 ~]# rsync --daemon
[root@web02 ~]# netstat -lntup | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 11759/rsync
tcp 0 0 :::873 :::* LISTEN 11759/rsync
rsync客户端配置
1.检查软件是否存在
[root@web01 ~]# rpm -qa |grep rsync
rsync-3.0.6-12.el6.x86_64
2.创建安全认证文件,并修改权限
[root@web01 ~]# echo "123456" > /etc/rsync.password
[root@web01 ~]# chmod 600 /etc/rsync.password
3.传输测试
[root@web01 zhang]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
[root@web01 ~]# rsync -avz /zhang rsync_backup@192.168.231.143::backup1 --password-file=/etc/rsync.password
sending incremental file list
zhang/
zhang/1.txt
zhang/2.txt
zhang/3.txt
zhang/4.txt
zhang/5.txt
sent 277 bytes received 107 bytes 768.00 bytes/sec
total size is 0 speedup is 0.00
部署inotify服务
1.安装inotify-tools软件
[root@web02 ~]# yum install inotify-tools
2.在rsync客户端编写脚本,实现rsync+inotify软件功能结合
#!/bin/bash
Path=/zhang
backup_Server=192.168.231.143
/usr/bin/inotifywait -mrq --format '%w%f' -e create,close_write,delete /zhang | while read line
do
if [ -f $line ];then
rsync -az $line --delete rsync_backup@$backup_Server::backup1 --password-file=/etc/rsync.password
else
cd $Path &&\
rsync -az ./ --delete rsync_backup@$backup_Server::backup1 --password-file=/etc/rsync.password
fi
done
测试
1.让脚本在后台运行
[root@web01 zhang]# sh /root/scripts/inotify.sh &
[1] 11788
[root@web01 zhang]# touch {1..5}.txt
[root@web01 zhang]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
2.当创建文件后,就会把文件同步到web02,rsync服务端
[root@web02 ~]# ll /backup/test1/
total 0
-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 1.txt
-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 2.txt
-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 3.txt
-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 4.txt
-rw-r--r-- 1 rsync rsync 0 Nov 10 14:27 5.txt
脚本停止方法
1.先查看后台都有哪些程序在运行
[root@web01 ~]# jobs
[1]+ Running sh scripts/inotify.sh &
2.在把程序调到前台按[Ctrl] + z挂起当前任务
[root@web01 ~]# jobs
[1]+ Running sh scripts/inotify.sh &
想要结束任务时,把[Ctrl] + z替换成[Ctrl]+c