rsync+inotify-tools实现文件自动同步

发布于 2020-07-08  223 次阅读


环境:centos7.4,已配置双机ssh免密登录
机器:
192.168.0.231 主服务器 目录 /node1
192.168.0.64 客户端服务器 目录 /node2
需求:这两个服务器的2个文件目录保持实时同步

说明:

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。
通俗来说,inotify可以监控文件的状态并且对变化的状态做出一些操作。
uname -a
Linux ansible-dev 3.10.0-327.el7.x86_64
版本2.6.32 大于2.6.13,则支持。
执行:
ll /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Oct 18 12:18 max_queued_events
-rw-r--r-- 1 root root 0 Oct 18 12:18 max_user_instances
-rw-r--r-- 1 root root 0 Oct 18 12:18 max_user_watches
有三项输出,则表示默认支持inotify,可以安装inotify-tools工具.
centos7版本上面已经默认安装了rsync和xinetd服务
rpm -aq |grep rsync
rpm -aq |grep xinetd
如无:
源服务器跟客户端服务器执行
yum -y install xinetd
yum -y install rsync
关闭防火墙和SELINUX,两台主机都执行
[[email protected] bin]sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
[[email protected] bin]getenforce
Enforcing
[[email protected] bin]setenforce 0
[[email protected] bin]firewall-cmd --state
[[email protected] bin]systemctl stop firewalld.service
[[email protected] bin]systemctl disable firewalld.service
客户端服务器:新建rsync配置文件及要同步的目录
[[email protected] node1]vim /etc/rsyncd.conf
[test]
        path = /node2/
        read only = false
        uid = root
        gid = root
[[email protected] node1]mkdir -p /node2
[[email protected] node1]/usr/bin/rsync --daemon
[[email protected] node1]netstat -ltnup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1051/master         
tcp        0      0 0.0.0.0:45954           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      936/zabbix_agentd   
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2927/rsync          
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      914/sshd 
看的873端口在监听
主服务器:新建rsync服务的默认配置文件
mkdir -p /etc/xinetd.d/
vim /etc/xinetd.d/rsync
service rsync
{
disable = no
socket_type     = stream
wait            = no
user            = root
server          = /usr/bin/rsync
server_args     = --daemon
port            = 873
log_on_failure += USERID
}
默认启动
[[email protected] tmp]/usr/bin/rsync --daemon
[[email protected] tmp]netstat -ltnup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      8005/rsync          
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      5455/rpcbind        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6297/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      6789/master
能看到873端口在监听,客户端服务器也需要启动rsync,并且防火墙和selinux都需要关闭或者开放873端口;
--如果你的配置文件是自己定的位置,那么在后面跟上conf文件的参数就可以了
[[email protected] tmp]/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
修改配置文件发布共享目录
vim /etc/rsyncd.conf       
uid = root
gid = root
use chroot = no
max connections = 10
strict modes = yes
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
log file= =/var/run/rsyncd.log

[test]
path= /node1
comment= analyse
read only = false
hosts allow = *
测试
[[email protected] tmp]rsync -a 192.168.0.64::test
drwxr-xr-x             18 2020/07/08 16:12:48 .
drwxr-xr-x          4,096 2020/07/08 16:11:55 node1

安装inotify-tools

[[email protected] tmp]cd /usr/local
[[email protected] tmp]wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
[[email protected] tmp]tar -xvf inotify-tools-3.14.tar.gz
[[email protected] tmp]cd inotify-tools-3.14/
[[email protected] tmp]./configure && make && make install

--新建启动配置脚本
[[email protected] tmp]vim inotify_bak.sh 
#!/bin/bash
#inotifywait -m -e close_write,delete,create,attrib /node1 |while read events
/usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib /node1/ |while read events
do
   /usr/bin/rsync -arzuq --delete /node1 192.168.0.64::test
   echo "`date +'%F %T'` 出现事件 $events" >>/tmp/rsync.log 2>&1
done
[[email protected] tmp]chmod +x inotify_bak.sh
[[email protected] tmp]nohup sh inotify_bak.sh &
nohup: 忽略输入并把输出追加到"nohup.out"
空格跳过
[[email protected] tmp]touch /node1/hallo{1..5}.txt
[[email protected] tmp]tail -f /tmp/rsync.log  
2020-07-08 15:33:05 出现事件 CREATE /node1/hallo1.txt
2020-07-08 15:33:05 出现事件 ATTRIB /node1/hallo1.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo2.txt
2020-07-08 15:33:06 出现事件 ATTRIB /node1/hallo2.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo3.txt
2020-07-08 15:33:06 出现事件 ATTRIB /node1/hallo3.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo4.txt
2020-07-08 15:33:06 出现事件 ATTRIB /node1/hallo4.txt
2020-07-08 15:33:06 出现事件 CREATE /node1/hallo5.txt
2020-07-08 15:33:07 出现事件 ATTRIB /node1/hallo5.txt
在客户端服务器能看到同步过来的5个文件
[[email protected] node1]ll
总用量 0
-rw-r--r-- 1 root root 0 7月   8 16:11 hallo1.txt
-rw-r--r-- 1 root root 0 7月   8 16:11 hallo2.txt
-rw-r--r-- 1 root root 0 7月   8 16:11 hallo3.txt
-rw-r--r-- 1 root root 0 7月   8 16:11 hallo4.txt
-rw-r--r-- 1 root root 0 7月   8 16:11 hallo5.txt

附录:inotifywait命令使用

监听/usr/local/src 目录:
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -e modify,delete,create,attrib /usr/local/src
参数 说明
-m 持续监听
-r 使用递归形式监视目录
-q 减少冗余信息,只打印出需要的信息
-e 指定要监视的事件,多个时间使用逗号隔开
--timefmt 时间格式
--format 监听到的文件变化的信息


--timefmt 说明:
ymd分别表示年月日,H表示小时,M表示分钟


--format 说明:
参数 说明
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式
执行上面的命令之后,在监听的目录下创建一个1.txt文件,得到如下结果:


22/03/18 17:22 /usr/local/src/ 1.txt CREATE
22/03/18 17:22 /usr/local/src/ 1.txt ATTRIB
可监听的时间有:


参数 说明
access 访问,读取文件。
modify 修改,文件内容被修改。
attrib 属性,文件元数据被修改。
move 移动,对文件进行移动操作。
create 创建,生成新文件
open 打开,对文件进行打开操作。
close 关闭,对文件进行关闭操作。
delete 删除,文件被删除。


inotify监听文件状态
查看inotify 软件
inotifywait命令可以用来收集有关文件访问信息
inotifywatch命令用于收集关于被监视的文件系统的统计数据,包括每个 inotify 事件发生多少次。

 

基本用法
[[email protected] nginx]inotifywait -h
inotifywait 3.14
Usage: inotifywait [ 选项 ] file1 [ file2 ] [ file3 ] [ ... ]
选项:
    @<file>       排除某些文件.
    --exclude <pattern>  排除匹配的文件
    --excludei <pattern> 大小写不敏感排除指定样式的文件
    -m|--monitor  保持监听状态,如果不设置这个选项,inotifywait只执行一次就会退出。
    -d|--daemon   类似于-m,但是在后台运行,输出事件到特定的文件可以通过 --outfile. 意味着 --syslog.
    -r|--recursive  递归监听目录
    -s|--syslog     发送错误日志到syslog而不是stderr
    -q|--quiet      静态模式,不输出信息
    -qq             什么都不输出
    --timefmt <fmt>  时间格式
    -e|--event <event1> [ -e|--event <event2> ... ]
        监听指定的事件,如果不指定,所有的事件都被监听。
Exit status:
    0  -  收到了指定的事件
    1  -  收到了没有指定的事件,或者出现了一些错误
    2  -  没有收到事件

可以监听的事件:
  access    访问,读取文件。
  modify    修改,文件内容被修改。
  attrib    属性,文件元数据被修改。
  move  移动,对文件进行移动操作。
  create    创建,生成新文件
  open  打开,对文件进行打开操作。
  close 关闭,对文件进行关闭操作。
  delete    删除,文件被删除。

案例

只有当nginx的配置文件写入完成的时候重启nginx

#!/bin/bash
inotifywait -m -e close_write -r /usr/local/openresty/nginx/conf/ |
while read events;
do
    echo $events;
    nginx -s reload;
    echo "Nginx reloaded!"
done
监听某个目录下的文件状态,输出事件
#!/bin/bash
filename watchdir.sh
path=$1
/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T %[w](http://man.linuxde.net/w "w命令") %f' -e modify,delete,create,attrib $path
总结
介绍了inotify-tools的一些特性,与命令的使用。
inotify可以监控文件的状态并且对文件变化的状态做出一些自定义操作。


公交车司机终于在众人的指责中将座位让给了老太太