SuSE Linux下 rsync+inotify实现文件自动同
2020-11-14 本文已影响0人
sunland_0416
SuSE Linux下 rsync+inotify实现文件自动同步(一)
SuSE Linux下 rsync+inotify实现文件自动同步(二)
上面两篇文章基本实现了rsync和inotify的基本功能
下面是来看看如何停止inotify
ps -ef|grep rsync|grep -v grep|grep -v daemon
可以看到有几个进程,杀死这几个进程PID即可停止inotify
同理可以杀死rsync进程来停止自定义配置文件的rsync服务。
如果是用默认/etc/rsync.conf和/etc/rsync.secrets的还可以用service start/stop/restart rsyncd命令来实现rsync服务的启动/停止/重启
上面都是一个客户端,一个服务端,如果有多个服务端,且服务端路径一致则inotify-tools的脚本可以写在循环里,(每个服务端的rsync配置是一样的)
#!/bin/bash
host=192.168.1.170
des_ip="192.168.166 192.168.165 192.168.164"
#下面的/不要忘记
src=/home/test/rsync/
des=web
passwd=/home/test/rsync.passwd
log=/home/test/rsyncd.log
user=root
/home/test/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -e modify,delete,attrib $src |while read files
do
for ip in $des_ip
do
/usr/bin/rsync -vzrtopg --delete --ignore-errors --password-file=$passwd $src $user@$ip::$des
echo "${files} was rsynced">>$log 2>&1
done
done
终极目标,如果src也是多个呢?即多目录多ip怎么实现同步?可以写多个inotify脚本,也可以直接写个shell函数,然后调用
下面的例子会把 170上的/home/test1/rsync和/home/test2/rsync 同步到164 165 166三个服务器的对应目录
服务端--目标服务器上的rsync.conf配置文件如下
uid=root
gid=root
use chroot=no
max connections=10
strict modes=yes
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsync.lock
log file=/home/test/rsyncd.log
ignore errors
read only=no
write only=no
hosts allow=192.168.166 192.168.165 192.168.164
host deny =*
list=false
auth users=root
secrets file=/home/test/rsync.passwd
[web1]
path=/home/test1/rsync
comment=web file
[web2]
path=/home/test2/rsync
comment=web file
客户端--源服务器上inotify的脚本如下
#!/bin/bash
host=192.168.1.170
des_ip="192.168.166 192.168.165 192.168.164"
#下面的/不要忘记;另外src跟des一定要匹配
src="/home/test1/rsync/ /home/test2/rsync/"
des="web1 web2"
passwd=/home/test/rsync.passwd
log=/home/test/rsyncd.log
user=root
fun_inotify(){
/home/test/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f %e' -e modify,delete,attrib $1 |while read files
do
for ip in $des_ip
do
/usr/bin/rsync -vzrtopg --delete --ignore-errors --password-file=$passwd $1 $user@$ip::$2
echo "${files} was rsynced">>$log 2>&1
done
done
}
src_list =($src)
src_len=${#src_list[@]}
des_list=($des)
des_len=${#des_list[@]}
if [ $src_len == $des_len ] ; then
for (( i = 0; i< src_len; i++))
do
fun_inotify ${src_list [i]} ${des_list[i]} &
done
else
echo "inotify config files wrong, src length is not equal des" >>$log 2>&1
fi
注意
1.如果使用默认的873端口必须是root用户,如果更改端口可以是非root用户
2.rsync+inotifywait的同步模式是阻塞模式,一定放到后台执行,不要影响其他任务执行