客户端:数据源;服务端:数据接收方
rsync官方文档:https://www.samba.org/ftp/rsync/rsync.html
手动测试用“通过远程外壳访问"里的语法:
参考1链接:https://blog.csdn.net/ljihe/article/details/52276889
在rc.local里面加入/usr/bin/rsync --daemon,然后保存退出。
chmod 755 /etc/rc.d/rc.local
查看rsync是否启动
netstat -lnt netstat -lntup |grep 873 #可以看到是哪个程序在管理
常用指令参考:https://www.cnblogs.com/f-ck-need-u/p/7220009.html
没有用后台daemon启动,手动测试的时候可以用这句来只同步一个文件(注意这里的用户必须是实际存在的,daemon模式下的用户可以是虚拟的):
排除指定文件夹和指定连接的端口:
rsync -avzcR --exclude='runtime/' --port=50000
测试端口是否可用,daemon服务器启动端口后用 telnet x.x.x.x. 50000 连接测试,连接后退出用"ctrl + ]",再用quit退出
用双冒号访问时,如果服务端如果没有启用--daemon客户端会收到这样的错误
服务端rsyncd.conf配置文件注释:https://blog.csdn.net/wwwyuanliang10000/article/details/48710545
服务端参考的最简单配置:
加载自定义配置文件:
加载自定义密码文件:
参考2链接:https://www.cnblogs.com/shihuc/p/5628893.html
客户端配置不用密码:
vi /etc/profile source /etc/profile env
export RSYNC_PASSWORD="rsyncuser的密码"
设置环境变量:https://jingyan.baidu.com/article/0f5fb099370f146d8234ea43.html
开机启动如果无效的话是文件权限不够,可以设置为755:https://jingyan.baidu.com/article/4853e1e5413b541909f72632.html
chmod 755 /etc/rc.d/rc.local
都设置完了不成功可以考虑关闭防火墙试一下:
CentOS 7防火墙: firewall-cmd --state //查看状态 systemctl stop firewalld.service //关闭 systemctl start firewalld.service //开启 systemctl disable firewalld.service //关闭开机启动 systemctl enable firewalld.service //开启开机启动
端口不通的提示如下:
rsync命令排除文件和文件夹(exclude-from):https://blog.csdn.net/liangdsh/article/details/51769910
-------------------------------------- inotify ---------------------------------------------------------
inotify 安装:https://www.cnblogs.com/pyrene/p/6414724.html
是否安装:
rpm -qa inotify-tools
线上安装:
yum install inotify-tools -y
手动测试
inotifywait -rm /home
inotify-tools命令使用讲解: https://www.centos.bz/2012/06/inotify-tools-introduction/
详细案例:http://www.ttlsa.com/web/let-infotify-rsync-fast/
#!/bin/bash src=/data/ # 需要同步的源路径 des=data # 目标服务器上 rsync --daemon 发布的名称,rsync --daemon这里就不做介绍了,网上搜一下,比较简单。 rsync_passwd_file=/etc/rsyncd.passwd # rsync验证的密码文件 ip1=192.168.0.18 # 目标服务器1 ip2=192.168.0.19 # 目标服务器2 user=root # rsync --daemon定义的验证用户名 cd ${src} # 此方法中,由于rsync同步的特性,这里必须要先cd到源目录,inotify再监听 ./ 才能rsync同步后目录结构一致,有兴趣的同学可以进行各种尝试观看其效果 /usr/local/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # 把监控到有发生更改的"文件路径列表"循环 do INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE echo "-------------------------------$(date)------------------------------------" echo $file #增加、修改、写入完成、移动进事件 #增、改放在同一个判断,因为他们都肯定是针对文件的操作,即使是新建目录,要同步的也只是一个空目录,不会影响速度。 if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # 判断事件类型 then echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO' rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && #(去掉&&可以在这个服务器不通的时候继续下一个指令) INO_FILE变量代表路径哦 -c校验文件内容 rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #仔细看 上面的rsync同步命令 源是用了$(dirname ${INO_FILE})变量 即每次只针对性的同步发生改变的文件的目录(只同步目标文件的方法在生产环境的某些极端环境下会漏文件 现在可以在不漏文件下也有不错的速度 做到平衡) 然后用-R参数把源的目录结构递归到目标后面 保证目录结构一致性 fi #删除、移动出事件 if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]] then echo 'DELETE or MOVED_FROM' rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} #看rsync命令 如果直接同步已删除的路径${INO_FILE}会报no such or directory错误 所以这里同步的源是被删文件或目录的上一级路径,并加上--delete来删除目标上有而源中没有的文件,这里不能做到指定文件删除,如果删除的路径越靠近根,则同步的目录月多,同步删除的操作就越花时间。这里有更好方法的同学,欢迎交流。 fi #修改属性事件 指 touch chgrp chmod chown等操作 if [[ $INO_EVENT =~ 'ATTRIB' ]] then echo 'ATTRIB' if [ ! -d "$INO_FILE" ] # 如果修改属性的是目录 则不同步,因为同步目录会发生递归扫描,等此目录下的文件发生同步时,rsync会顺带更新此目录。 then rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip1}::${des} && rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${ip2}::${des} fi fi done
开机启动参考:https://blog.csdn.net/w124374860/article/details/52684518
程序在后台不挂断运行
nohup abc.sh &
jobs
fg [num]
ctrl + c
或
nohup ./abc.sh >/dev/null 2>log &