摘要:搭建的gitlab服务器,硬盘不太可靠,是一块不知名的mSATA硬盘,前面通过手动通过(xshell + xftp)的方式进行备份到其他电脑,这里通过 inotify+rsync 自动备份一下
相关文章
- CentOS7上安装gitlab
- gitlab使用163邮箱向用户发送邮件
- CentOS 7.8 密码重置
- centos7 centos-home 磁盘空间转移至centos-root下
- xftp5 连接 centos7.8
- gitlab备份库局域网中远程备份至另一台windows电脑
一、xshell + xftp手动备份
01、创建gitlab备份
在保持gitlab处于正常运行状态,直接执行gitlab-rake gitlab:backup:create进行备份
[root@localhost ~]# gitlab-rake gitlab:backup:create
2021-06-19 14:26:30 +0800 -- Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2021-06-19 14:26:34 +0800 -- done
2021-06-19 14:26:34 +0800 -- Dumping repositories ...
* company/gitfilecompany (@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35) ... [SKIPPED]
[SKIPPED] Wiki
* dylyy/myselfsystem (@hashed/4e/07/4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce) ... [DONE]
[SKIPPED] Wiki
* zzshkj/queue_system_zzcar (@hashed/4b/22/4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a) ... [DONE]
[SKIPPED] Wiki
* nanxinhospital/nanxinhospitalandroid (@hashed/79/02/7902699be42c8a8e46fbbb4501726517e86b22c56a189f7625a6da49081b2451) ... [DONE]
[SKIPPED] Wiki
* nanxinhospital/nanxinhospitalwindow (@hashed/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3) ... [DONE]
[SKIPPED] Wiki
* ynwnkj/php (@hashed/19/58/19581e27de7ced00ff1ce50b2047e7a567c76b1cbaebabe5ef03f7c3017bb5b7) ... [DONE]
[SKIPPED] Wiki
* yayb/php (@hashed/4a/44/4a44dc15364204a80fe80e9039455cc1608281820fe2b24f1e5233ade6af1dd5) ... [DONE]
... ... ...
[SKIPPED] Wiki
* hqzxrc/php (@hashed/05/ad/05ada863a4cf9660fd8c68e2295f1d35b2264815f5b605003d6625bd9e0492cf) ... [DONE]
[SKIPPED] Wiki
* cdgsgl/php (@hashed/9a/e2/9ae2bdd7beedc2e766c6b76585530e16925115707dc7a06ab5ee4aa2776b2c7b) ... [DONE]
[SKIPPED] Wiki
* xzsnrmyy/shannanwindow (@hashed/8e/61/8e612bd1f5d132a339575b8dafb7842c64614e56bcf3d5ab65a0bc4b34329407) ... [DONE]
[SKIPPED] Wiki
* cdzlzb/php (@hashed/04/30/043066daf2109523a7490d4bfad4766da5719950a2b5f96d192fc0537e84f32a) ... [DONE]
[SKIPPED] Wiki
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping uploads ...
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping builds ...
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping artifacts ...
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping pages ...
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping lfs objects ...
2021-06-19 14:30:58 +0800 -- done
2021-06-19 14:30:58 +0800 -- Dumping container registry images ...
2021-06-19 14:30:58 +0800 -- [DISABLED]
Creating backup archive: 1624084258_2021_06_19_13.1.1-ee_gitlab_backup.tar ... done
Uploading backup archive to remote storage ... skipped
Deleting tmp directories ... done
done
done
done
done
done
done
done
Deleting old backups ... skipping
Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data
and are not included in this backup. You will need these files to restore a backup.
Please back them up manually.
Backup task is done.
[root@localhost ~]#
末尾的警告提示为:没有自动备份 gitlab.rb 和 gitlab-secrets.json 这两个文件,需要备份。可手动备份,路径在 /etc/gitlab 下
02、查看备份文件
使用以上命令会在/var/opt/gitlab/backups目录下创建一个名称类似为1530156812_2018_06_28_10.8.4_gitlab_backup.tar的压缩包, 这个压缩包就是Gitlab整个的完整部分, 其中开头的1530156812_2018_06_28_10.8.4是备份创建的日期。通过xftp可以拷贝到其他电脑上
二、inotify+rsync 远程备份
让gitlab定时运行它自己的备份任务,他会把库中所有项目信息和权限管理等信息,打包备份成一个压缩包。可以通过gitlab的自带命令导回去(gitlab程序版本必须完全一致)。
然后让inotify实时监控gitlab的备份目录,在备份目录发生变化时,告知rsync,让它以增量方式实时同步到远端存储(windows共享)上。
rsync除了增量方式,安全起见,再写一个定时任务,比如每2小时就全量备份同步一次。
2.1 windows安装cwRsyncserver
01、安装cwRsyncserver
从网上搜索cwRsyncServer_4.1.0_Installer.exe或者通过下方连接在CSDN资源上下载,在windows下进行安装。我选择的是默认安装位置:C:\Program Files (x86)\ICW,安装时会给windows创建一个账号,默认是SvcCWRSYNC,密码我们设定为123456。
注意:上面的安装的地址和初始密码的设定很重要,一定要牢记
02、配置cwRsyncserver
打开 ``C:\Program Files (x86)\ICW`` 安装目录下的rsyncd.conf文件,编辑同步服务器(同步目的)的配置信息
use chroot = false
strict modes = false
hosts allow = * #允许所有主机连接
#指定日志文件输出位置,下面地址为:e:\synch_backup_home\rsyncd.log
log file = /cygdrive/e/synch_backup_home/rsyncd.log
uid = 0 # 需要配置此项,不然连接报错
gid = 0 # 需要配置此项,不然连接报错
#新增自己的库配置信息
#自定义库名称,客户端连接时需指定这个名字
[syn_git_repo]
#仓库位置,对应本机为:e:\synch_backup_home\gitlabbuckup
path = /cygdrive/e/synch_backup_home/gitlabbuckup
#可读可写
read only = false
#输出日志
transfer logging = yes
#不允许客户端列出服务端的信息
#list = no
# 对应配置用户名
auth users = SvcCWRSYNC
#指定密码文件的位置,本机为:e:\synch_backup_home\rsync.passwd
secrets file = /cygdrive/e/synch_backup_home/rsync.passwd
# ————————————默认的配置文件————————————
#use chroot = false
#strict modes = false
#hosts allow = *
#log file = rsyncd.log
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
#[test]
#path = /cygdrive/c/work
#read only = false
#transfer logging = yes
[syn_git_repo]为自定义的服务端仓库名称,客户端(Centos7备份源)连接时需指定这个库的名称。
rsync.passwd文件中内容为:SvcCWRSYNC:123456
SvcCWRSYNC为备份时鉴权使用的账号名。123456为密码。
03、rsync.passwd配置
在02步,我们看见了有一个 rsync.passwd 的配置,此处,一定要注意。不然后续悔一直连接不上,提示没有权限。
![](https://i-blog.csdnimg.cn/blog_migrate/3c00387417c5fc069727c67815d59b9b.png)
04、备份目的文件夹授权
为了防止客户端向服务器中备份文件时没有权限,按照网上的建议,我们把备份目的文件夹,也就是上面指定的仓库目录“E:\synch_backup_home\shared_repository”进行共享,并赋予SvcCWRSYNC用户所有权限。(有的教程中无此项配置,我为了以防万一还是授权了)
![](https://i-blog.csdnimg.cn/blog_migrate/3c588c4c776a7db42304ac27d07b78f6.png)
05、重启rsync服务
修改完配置文件后,我们打开计算机的服务页面,在里面找到名为“RsyncServer”的服务。
把它设定为开机自动启动,然后重启它。
到此为止,windows服务器(备份目的)端就配置完毕了
2.2 Centos7(备份源),安装inotify和rsync客户端
01、修改gitlab配置文件
vim /etc/gitlab/gitlab.rb
找到备份相关的两项,如果没有在可在尾部自行增加即可,进行修改:
#auto gitlab backups
#置文件来修改默认存放备份文件的目录,以下为默认地址
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
#备份文件保存时间,单位是秒,默认是2天
gitlab_rails['backup_keep_time'] = 172800
修改完毕后保存退出,之后让gitlab重新配置一下:
gitlab-ctl reconfigure #重新配置
gitlab-ctl restart #重启gitlab服务
gitlab-ctl reconfigure
gitlab-ctl restart
02、安装inotify和rsync客户端
接下来,该准备安装之前所说的“inotify(文件实时监控)+rsync(文件实时同步)的综合解决方案”所需的这两个命令了。
安装 inotify
方式一:通过 yum 安装
yum install inotify-tools -y
若提示找不到软件,则需先安装Centos7的扩展安装源:
yum install epel-release
方式二:通过rpm文件安装
注:自己通过以上方式没能成功安装,后续采用通过 rpm格式进行成功安装
将二进制的rpm(inotify-tools-3.14-9.el7.x86_64.rpm)拷贝到centos设别上,执行一下命令,我自己存在路劲给为 ``/home/soft_storge``
[root@localhost soft_storge]# rpm -ivh inotify-tools-3.14-9.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:inotify-tools-3.14-9.el7 ################################# [100%]
[root@localhost soft_storge]# rpm -qa inotify-tools
inotify-tools-3.14-9.el7.x86_64
[root@localhost soft_storge]#
安装rsync客户端
yum -y install rsync
03、centos上创建密钥
在Centos7中再创建一个rsync.passwd文件,用于同步时指定密码。
我创建到了“/home/synch_backup_home/rsync.passwd”,文件中的内容为:123456
04、测试是否可成功同步
在配置的备份目录中/var/opt/gitlab/backups 创建几个文本或者执行一次gitlab的备份 ,难得创建。
然后运行下面的命令,开始全量同步测试:
rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
运行成功结果
[root@localhost soft_storge]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
sending incremental file list
./
1627996113_2021_08_03_13.1.1-ee_gitlab_backup.tar
sent 4,112,522,341 bytes received 41 bytes 14,873,498.67 bytes/sec
total size is 4,119,470,080 speedup is 1.00
[root@localhost soft_storge]#
上面命令中的几个参数说明:
“--password-file=/home/synch_backup_home/rsync.passwd”参数指定同步时的连接密码文件位置(里面是123456)。
上面参数紧跟着的“/var/opt/gitlab/backups/”,为备份源文件夹位置,请加上最后的“/”,否则会在目的文件夹根目录中再创建一个名为“shared_repository”的文件夹。
最后的参数“SvcCWRSYNC@192.168.0.107::syn_git_repo”分为3段:
第一段“SvcCWRSYNC”为对应服务器端的用户名;
第二段“192.168.2.165”为rsync服务器地址(备份目的);
第三段“syn_git_repo”为rsync服务器端配置的自定义仓库名称(与上面rsyncd.conf文件的配置对应)。
05、编辑增量实时同步脚本
为了做到按需实时同步有变化的文件(rsync增量同步),需要配合使用inotify实时监控和rsync的增量同步。
因此,我们需要编写一个sh脚本文件,并在开机时启动它(开机后自动开始监控功能)。
我们在“/home/synch_backup_home/”目录中,编辑增量实时同步脚本“inotify_start.sh”,内容如下(在此感谢第一个编写如下脚本的朋友,我只是做了略微调整):
#!/bin/bash
#
#先定义脚本中所需各种变量
src=/var/opt/gitlab/backups # 需要同步的源路径
log_file=/home/synch_backup_home/rsync.log #日志输出文件路径
#
do
INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT
echo $file
#增加、修改、写入完成、移动进事件
then
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'
#INO_FILE变量代表路径哦 -c校验文件内容
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${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}@${server_ip}::${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}@${server_ip}::${des}
fi
fi
#记录日志
echo "${file} was rsynced at $(date "+%Y%m%d-%H%M%S")" >>${log_file} 2>&1
done
记得给inotify_start.sh添加运行权限:
chmod 500 inotify_start.sh
上面权限设置为,仅对当前用户能够读取和执行(避免被修改)。
很遗憾,以上脚本可以运行起来,但是未能执行远程备份操作
06、开启定时任务,启动所有功能
到此为止,windows端具备了同步服务的能力,Centos7我们也具备了同步gitlab备份仓库的能力,只差自动运行了。
因此,我们通过Centos7的crontab定时任务,来完成开机启用实时备份、同步的能力。
crontab -e
按“i”进入编辑模式,在其中增加定时任务,我把我整个定时任务全部贴出来,仅供参考:
#在开机后,等待25秒后,开始运行实时同步备份脚本
@reboot (sleep 25;sh /home/synch_backup_home/inotify_start.sh)
#每天23:30运行一次gitlab仓库的全量的同步,并在前面添加开始时间、后面添加结束时间
30 23 * * * (/usr/bin/date "+\%Y\%m\%d-\%H\%M\%S full backup begin:";/usr/bin/rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo;/usr/bin/date "+\%Y\%m\%d-\%H\%M\%S full backup end!") >>/home/synch_backup_home/full_backup.log 2>&1
#每天在23的时候,开始运行gitlab的备份功能
00 23 * * * /usr/bin/gitlab-rake gitlab:backup:create
为了避免备份遗漏,建议还是加上定时全量备份。
增量备份的日志会输出到“/home/synch_backup_home/rsync.log”中。
全量备份的日志会输出到“/home/synch_backup_home/full_backup.log”中。
三、问题记录
01、Connection timed out (110)
[root@localhost ~]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::gitlabbuckup
@ERROR: Unknown module 'gitlabbuckup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
在连接执行远程备份的时候,提示连接超时。后续发现问在windows服务端上,自己开启了防火墙,需要将在windows防火墙中放开 873 端口
02、Unknown module 'gitlabbuckup'
[root@localhost ~]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::gitlabbuckup
@ERROR: Unknown module 'gitlabbuckup'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
发现为最后一个参数写错,参数为服务器端中,配置文件的标题
03、password file must not be other-accessible
[root@localhost ~]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
[root@localhost ~]#
发现为其文件权限不正确,修改文件权限。自己密码文件直接在windows上创建后拖入,没有修改权限,需要参照下方修改权限,设置为仅自己可读可写。
[root@localhost home]# cd ./synch_backup_home
[root@localhost synch_backup_home]# ls
rsync.passwd
[root@localhost synch_backup_home]# ll | grep rsync.passwd
-rw-r--r--. 1 root root 8 8月 11 17:48 rsync.passwd
[root@localhost synch_backup_home]# chmod 600 rsync.passwd
[root@localhost synch_backup_home]# ll | grep rsync.passwd
-rw-------. 1 root root 8 8月 11 17:48 rsync.passwd
[root@localhost synch_backup_home]#
04、auth failed on module syn_git_repo
[root@localhost synch_backup_home]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@192.168.2.165::syn_git_repo
@ERROR: auth failed on module syn_git_repo
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
windows服务器日志
2021/08/12 13:35:41 [8720] rsyncd version 3.0.8 starting, listening on port 873
2021/08/12 13:36:12 [3460] name lookup failed for 192.168.2.166: hostname nor servname provided, or not known
2021/08/12 13:36:12 [3460] connect from UNKNOWN (192.168.2.166)
2021/08/12 13:36:12 [3460] auth failed on module syn_git_repo from unknown (192.168.2.166): missing secret for user "SvcCWRSYNC"
以上问题,主要未没有在windows创建密码文件。需要以下处理方式
- 在windows上的文件夹进行共享
- 在windows服务端密码文件,需要按照 user:password的方式配置
05、/bin/bash^M: 坏的解释器: 没有那个文件或目录
[root@localhost ~]# sh /home/synch_backup_home/inotify_start.sh
/home/synch_backup_home/inotify_start.sh:行2: $'\r': 未找到命令
/home/synch_backup_home/inotify_start.sh:行10: $'\r': 未找到命令
/home/synch_backup_home/inotify_start.sh:行28: 条件表达式中有语法错误
' 附近有语法错误up_home/inotify_start.sh:行28: `]]
'home/synch_backup_home/inotify_start.sh:行28: ` if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]
[root@localhost ~]#
对脚本进行 路径的执行时,提示如上错误
[root@localhost synch_backup_home]# ./inotify_start.sh
-bash: ./inotify_start.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
[root@localhost synch_backup_home]#
进入路径直接运行时,提示如上错误
其实两者都是一个问题导致,只是不同的运行方式导致不同的提示。问题为自己是在windows上编辑后,直接放入centos上,文件的换行在windows为 \r\n 而 在centos 为 \n 而导致。其中 \r 在centos上显示为 ^M
centos内容显示
[root@localhost synch_backup_home]# cat -A inotify_start.sh
#!/bin/bash^M$
#^M$
#M-eM-^EM-^HM-eM-.M-^ZM-dM-9M-^IM-hM-^DM-^ZM-fM-^\M-,M-dM-8M--M-fM-^IM-^@M-iM-^\M-^@M-eM-^PM-^DM-gM-'M-^MM-eM-^OM-^XM-iM-^GM-^O^M$
src=/var/opt/gitlab/backups # M-iM-^\M-^@M-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-hM-7M-/M-eM->M-^D^M$
des=syn_git_repo # M-gM-^[M-.M-fM- M-^GM-fM-^\M-^MM-eM-^JM-!M-eM-^YM-(M-dM-8M-^J rsync --daemon M-eM-^OM-^QM-eM-8M-^CM-gM-^ZM-^DM-eM-^PM-^MM-gM-'M-0M-oM-<M-^Lrsync --daemonM-hM-?M-^YM-iM-^GM-^LM-eM-0M-1M-dM-8M-^MM-eM-^AM-^ZM-dM-;M-^KM-gM-;M-^MM-dM-:M-^FM-oM-<M-^LM-gM-=M-^QM-dM-8M-^JM-fM-^PM-^\M-dM-8M-^@M-dM-8M-^KM-oM-<M-^LM-fM-/M-^TM-hM->M-^CM-gM-.M-^@M-eM-^MM-^UM-cM-^@M-^B^M$
rsync_passwd_file=/home/synch_backup_home/rsync.passwd # rsyncM-iM-*M-^LM-hM-/M-^AM-gM-^ZM-^DM-eM-/M-^FM-gM- M-^AM-fM-^VM-^GM-dM-;M-6^M$
server_ip=192.168.2.165 # M-gM-^[M-.M-fM- M-^GM-fM-^\M-^MM-eM-^JM-!M-eM-^YM-(^M$
user=SvcCWRSYNC # rsync --daemonM-eM-.M-^ZM-dM-9M-^IM-gM-^ZM-^DM-iM-*M-^LM-hM-/M-^AM-gM-^TM-(M-fM-^HM-7M-eM-^PM-^M^M$
log_file=/home/synch_backup_home/rsync.log #M-fM-^WM-%M-eM-?M-^WM-hM->M-^SM-eM-^GM-:M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^D^M$
#^M$
cd ${src} # M-fM--M-$M-fM-^VM-9M-fM-3M-^UM-dM-8M--M-oM-<M-^LM-gM-^TM-1M-dM-:M-^NrsyncM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^IM-9M-fM-^@M-'M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-eM-?M-^EM-iM-!M-;M-hM-&M-^AM-eM-^EM-^HcdM-eM-^HM-0M-fM-:M-^PM-gM-^[M-.M-eM-=M-^UM-oM-<M-^LinotifyM-eM-^FM-^MM-gM-^[M-^QM-eM-^PM-, ./ M-fM-^IM-^MM-hM-^CM-=rsyncM-eM-^PM-^LM-fM--M-%M-eM-^PM-^NM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-oM-<M-^LM-fM-^\M-^IM-eM-^EM-4M-hM-6M-#M-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&M-eM-^OM-/M-dM-;M-%M-hM-?M-^[M-hM-!M-^LM-eM-^PM-^DM-gM-'M-^MM-eM-0M-^]M-hM-/M-^UM-hM-'M-^BM-gM-^\M-^KM-eM-^EM-6M-fM-^UM-^HM-fM-^^M-^\^M$
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # M-fM-^JM-^JM-gM-^[M-^QM-fM-^NM-'M-eM-^HM-0M-fM-^\M-^IM-eM-^OM-^QM-gM-^TM-^_M-fM-^[M-4M-fM-^TM-9M-gM-^ZM-^D"M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^DM-eM-^HM-^WM-hM-!M-("M-eM->M-*M-gM-^NM-/^M$
do^M$
INO_EVENT=$(echo $file | awk '{print $1}') # M-fM-^JM-^JinotifyM-hM->M-^SM-eM-^GM-:M-eM-^HM-^GM-eM-^IM-2 M-fM-^JM-^JM-dM-:M-^KM-dM-;M-6M-gM-1M-;M-eM-^^M-^KM-iM-^CM-(M-eM-^HM-^FM-hM-5M-^KM-eM-^@M-<M-gM-;M-^YINO_EVENT^M$
INO_FILE=$(echo $file | awk '{print $2}') # M-fM-^JM-^JinotifyM-hM->M-^SM-eM-^GM-:M-eM-^HM-^GM-eM-^IM-2 M-fM-^JM-^JM-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^DM-iM-^CM-(M-eM-^HM-^FM-hM-5M-^KM-eM-^@M-<M-gM-;M-^YINO_FILE^M$
echo "-------------------------------$(date)------------------------------------"^M$
echo $file^M$
#M-eM-"M-^^M-eM-^JM- M-cM-^@M-^AM-dM-?M-.M-fM-^TM-9M-cM-^@M-^AM-eM-^FM-^YM-eM-^EM-%M-eM-.M-^LM-fM-^HM-^PM-cM-^@M-^AM-gM-'M-;M-eM-^JM-(M-hM-?M-^[M-dM-:M-^KM-dM-;M-6^M$
#M-eM-"M-^^M-cM-^@M-^AM-fM-^TM-9M-fM-^TM->M-eM-^\M-(M-eM-^PM-^LM-dM-8M-^@M-dM-8M-*M-eM-^HM-$M-fM-^VM--M-oM-<M-^LM-eM-^[M- M-dM-8M-:M-dM-;M-^VM-dM-;M-,M-iM-^CM-=M-hM-^BM-/M-eM-.M-^ZM-fM-^XM-/M-iM-^RM-^HM-eM-/M-9M-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-fM-^SM-^MM-dM-=M-^\M-oM-<M-^LM-eM-^MM-3M-dM-=M-?M-fM-^XM-/M-fM-^VM-0M-eM-;M-:M-gM-^[M-.M-eM-=M-^UM-oM-<M-^LM-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-dM-9M-^_M-eM-^OM-*M-fM-^XM-/M-dM-8M-^@M-dM-8M-*M-gM-)M-:M-gM-^[M-.M-eM-=M-^UM-oM-<M-^LM-dM-8M-^MM-dM-<M-^ZM-eM-=M-1M-eM-^SM-^MM-iM-^@M-^_M-eM-:M-&M-cM-^@M-^B^M$
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # M-eM-^HM-$M-fM-^VM--M-dM-:M-^KM-dM-;M-6M-gM-1M-;M-eM-^^M-^K^M$
then^M$
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'^M$
^I^I^I^I#INO_FILEM-eM-^OM-^XM-iM-^GM-^OM-dM-;M-#M-hM-!M-(M-hM-7M-/M-eM->M-^DM-eM-^SM-& -cM-fM- M-!M-iM-*M-^LM-fM-^VM-^GM-dM-;M-6M-eM-^FM-^EM-eM-.M-9^M$
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}^M$
#M-dM-;M-^TM-gM-;M-^FM-gM-^\M-^K M-dM-8M-^JM-iM-^]M-"M-gM-^ZM-^DrsyncM-eM-^PM-^LM-fM--M-%M-eM-^QM-=M-dM-;M-$ M-fM-:M-^PM-fM-^XM-/M-gM-^TM-(M-dM-:M-^F$(dirname ${INO_FILE})M-eM-^OM-^XM-iM-^GM-^O M-eM-^MM-3M-fM-/M-^OM-fM-,M-!M-eM-^OM-*M-iM-^RM-^HM-eM-/M-9M-fM-^@M-'M-gM-^ZM-^DM-eM-^PM-^LM-fM--M-%M-eM-^OM-^QM-gM-^TM-^_M-fM-^TM-9M-eM-^OM-^XM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^U(M-eM-^OM-*M-eM-^PM-^LM-fM--M-%M-gM-^[M-.M-fM- M-^GM-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-fM-^VM-9M-fM-3M-^UM-eM-^\M-(M-gM-^TM-^_M-dM-:M-'M-gM-^NM-/M-eM-"M-^CM-gM-^ZM-^DM-fM-^_M-^PM-dM-:M-^[M-fM-^^M-^AM-gM-+M-/M-gM-^NM-/M-eM-"M-^CM-dM-8M-^KM-dM-<M-^ZM-fM-<M-^OM-fM-^VM-^GM-dM-;M-6 M-gM-^NM-0M-eM-^\M-(M-eM-^OM-/M-dM-;M-%M-eM-^\M-(M-dM-8M-^MM-fM-<M-^OM-fM-^VM-^GM-dM-;M-6M-dM-8M-^KM-dM-9M-^_M-fM-^\M-^IM-dM-8M-^MM-iM-^TM-^YM-gM-^ZM-^DM-iM-^@M-^_M-eM-:M-& M-eM-^AM-^ZM-eM-^HM-0M-eM-9M-3M-hM-!M-!) M-gM-^DM-6M-eM-^PM-^NM-gM-^TM-(-RM-eM-^OM-^BM-fM-^UM-0M-fM-^JM-^JM-fM-:M-^PM-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-iM-^@M-^RM-eM-=M-^RM-eM-^HM-0M-gM-^[M-.M-fM- M-^GM-eM-^PM-^NM-iM-^]M-" M-dM-?M-^]M-hM-/M-^AM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-fM-^@M-'^M$
fi^M$
#M-eM-^HM- M-iM-^YM-$M-cM-^@M-^AM-gM-'M-;M-eM-^JM-(M-eM-^GM-:M-dM-:M-^KM-dM-;M-6^M$
if [[ $INO_EVENT =~ 'DELETE' ]] || [[ $INO_EVENT =~ 'MOVED_FROM' ]]^M$
then^M$
echo 'DELETE or MOVED_FROM'^M$
rsync -avzR --delete --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}^M$
#M-gM-^\M-^KrsyncM-eM-^QM-=M-dM-;M-$ M-eM-&M-^BM-fM-^^M-^\M-gM-^[M-4M-fM-^NM-%M-eM-^PM-^LM-fM--M-%M-eM-7M-2M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-hM-7M-/M-eM->M-^D${INO_FILE}M-dM-<M-^ZM-fM-^JM-%no such or directoryM-iM-^TM-^YM-hM-/M-/ M-fM-^IM-^@M-dM-;M-%M-hM-?M-^YM-iM-^GM-^LM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-fM-^XM-/M-hM-"M-+M-eM-^HM- M-fM-^VM-^GM-dM-;M-6M-fM-^HM-^VM-gM-^[M-.M-eM-=M-^UM-gM-^ZM-^DM-dM-8M-^JM-dM-8M-^@M-gM-:M-'M-hM-7M-/M-eM->M-^DM-oM-<M-^LM-eM-9M-6M-eM-^JM- M-dM-8M-^J--deleteM-fM-^]M-%M-eM-^HM- M-iM-^YM-$M-gM-^[M-.M-fM- M-^GM-dM-8M-^JM-fM-^\M-^IM-hM-^@M-^LM-fM-:M-^PM-dM-8M--M-fM-2M-!M-fM-^\M-^IM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-dM-8M-^MM-hM-^CM-=M-eM-^AM-^ZM-eM-^HM-0M-fM-^LM-^GM-eM-.M-^ZM-fM-^VM-^GM-dM-;M-6M-eM-^HM- M-iM-^YM-$M-oM-<M-^LM-eM-&M-^BM-fM-^^M-^\M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-hM-7M-/M-eM->M-^DM-hM-6M-^JM-iM-^]M- M-hM-?M-^QM-fM- M-9M-oM-<M-^LM-eM-^HM-^YM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^UM-fM-^\M-^HM-eM-$M-^ZM-oM-<M-^LM-eM-^PM-^LM-fM--M-%M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-fM-^SM-^MM-dM-=M-^\M-eM-0M-1M-hM-6M-^JM-hM-^JM-1M-fM-^WM-6M-iM-^WM-4M-cM-^@M-^BM-hM-?M-^YM-iM-^GM-^LM-fM-^\M-^IM-fM-^[M-4M-eM-%M-=M-fM-^VM-9M-fM-3M-^UM-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&M-oM-<M-^LM-fM-,M-"M-hM-?M-^NM-dM-:M-$M-fM-5M-^AM-cM-^@M-^B^M$
fi^M$
#M-dM-?M-.M-fM-^TM-9M-eM-1M-^^M-fM-^@M-'M-dM-:M-^KM-dM-;M-6 M-fM-^LM-^G touch chgrp chmod chownM-gM--M-^IM-fM-^SM-^MM-dM-=M-^\^M$
if [[ $INO_EVENT =~ 'ATTRIB' ]]^M$
then^M$
echo 'ATTRIB'^M$
if [ ! -d "$INO_FILE" ] # M-eM-&M-^BM-fM-^^M-^\M-dM-?M-.M-fM-^TM-9M-eM-1M-^^M-fM-^@M-'M-gM-^ZM-^DM-fM-^XM-/M-gM-^[M-.M-eM-=M-^U M-eM-^HM-^YM-dM-8M-^MM-eM-^PM-^LM-fM--M-%M-oM-<M-^LM-eM-^[M- M-dM-8M-:M-eM-^PM-^LM-fM--M-%M-gM-^[M-.M-eM-=M-^UM-dM-<M-^ZM-eM-^OM-^QM-gM-^TM-^_M-iM-^@M-^RM-eM-=M-^RM-fM-^IM-+M-fM-^OM-^OM-oM-<M-^LM-gM--M-^IM-fM--M-$M-gM-^[M-.M-eM-=M-^UM-dM-8M-^KM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-eM-^OM-^QM-gM-^TM-^_M-eM-^PM-^LM-fM--M-%M-fM-^WM-6M-oM-<M-^LrsyncM-dM-<M-^ZM-iM-!M-:M-eM-8M-&M-fM-^[M-4M-fM-^VM-0M-fM--M-$M-gM-^[M-.M-eM-=M-^UM-cM-^@M-^B^M$
then^M$
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}^M$
fi^M$
fi^M$
^I^I^M$
^I^I#M-hM-.M-0M-eM-=M-^UM-fM-^WM-%M-eM-?M-^W^M$
^I^Iecho "${file} was rsynced at $(date "+%Y%m%d-%H%M%S")" >>${log_file} 2>&1^M$
done^M$
[root@localhost synch_backup_home]#
此问题我们可以通过 替换 的方式进行解决
sed -i 's/\r$//' inotify_start.sh
替换后的内容
[root@localhost synch_backup_home]# sed -i 's/\r$//' inotify_start.sh
[root@localhost synch_backup_home]# cat -A inotify_start.sh
#!/bin/bash$
#$
#M-eM-^EM-^HM-eM-.M-^ZM-dM-9M-^IM-hM-^DM-^ZM-fM-^\M-,M-dM-8M--M-fM-^IM-^@M-iM-^\M-^@M-eM-^PM-^DM-gM-'M-^MM-eM-^OM-^XM-iM-^GM-^O$
src=/var/opt/gitlab/backups # M-iM-^\M-^@M-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-hM-7M-/M-eM->M-^D$
des=syn_git_repo # M-gM-^[M-.M-fM- M-^GM-fM-^\M-^MM-eM-^JM-!M-eM-^YM-(M-dM-8M-^J rsync --daemon M-eM-^OM-^QM-eM-8M-^CM-gM-^ZM-^DM-eM-^PM-^MM-gM-'M-0M-oM-<M-^Lrsync --daemonM-hM-?M-^YM-iM-^GM-^LM-eM-0M-1M-dM-8M-^MM-eM-^AM-^ZM-dM-;M-^KM-gM-;M-^MM-dM-:M-^FM-oM-<M-^LM-gM-=M-^QM-dM-8M-^JM-fM-^PM-^\M-dM-8M-^@M-dM-8M-^KM-oM-<M-^LM-fM-/M-^TM-hM->M-^CM-gM-.M-^@M-eM-^MM-^UM-cM-^@M-^B$
rsync_passwd_file=/home/synch_backup_home/rsync.passwd # rsyncM-iM-*M-^LM-hM-/M-^AM-gM-^ZM-^DM-eM-/M-^FM-gM- M-^AM-fM-^VM-^GM-dM-;M-6$
server_ip=192.168.2.165 # M-gM-^[M-.M-fM- M-^GM-fM-^\M-^MM-eM-^JM-!M-eM-^YM-($
user=SvcCWRSYNC # rsync --daemonM-eM-.M-^ZM-dM-9M-^IM-gM-^ZM-^DM-iM-*M-^LM-hM-/M-^AM-gM-^TM-(M-fM-^HM-7M-eM-^PM-^M$
log_file=/home/synch_backup_home/rsync.log #M-fM-^WM-%M-eM-?M-^WM-hM->M-^SM-eM-^GM-:M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^D$
#$
cd ${src} # M-fM--M-$M-fM-^VM-9M-fM-3M-^UM-dM-8M--M-oM-<M-^LM-gM-^TM-1M-dM-:M-^NrsyncM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^IM-9M-fM-^@M-'M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-eM-?M-^EM-iM-!M-;M-hM-&M-^AM-eM-^EM-^HcdM-eM-^HM-0M-fM-:M-^PM-gM-^[M-.M-eM-=M-^UM-oM-<M-^LinotifyM-eM-^FM-^MM-gM-^[M-^QM-eM-^PM-, ./ M-fM-^IM-^MM-hM-^CM-=rsyncM-eM-^PM-^LM-fM--M-%M-eM-^PM-^NM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-oM-<M-^LM-fM-^\M-^IM-eM-^EM-4M-hM-6M-#M-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&M-eM-^OM-/M-dM-;M-%M-hM-?M-^[M-hM-!M-^LM-eM-^PM-^DM-gM-'M-^MM-eM-0M-^]M-hM-/M-^UM-hM-'M-^BM-gM-^\M-^KM-eM-^EM-6M-fM-^UM-^HM-fM-^^M-^\$
/usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ./ | while read file # M-fM-^JM-^JM-gM-^[M-^QM-fM-^NM-'M-eM-^HM-0M-fM-^\M-^IM-eM-^OM-^QM-gM-^TM-^_M-fM-^[M-4M-fM-^TM-9M-gM-^ZM-^D"M-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^DM-eM-^HM-^WM-hM-!M-("M-eM->M-*M-gM-^NM-/$
do$
INO_EVENT=$(echo $file | awk '{print $1}') # M-fM-^JM-^JinotifyM-hM->M-^SM-eM-^GM-:M-eM-^HM-^GM-eM-^IM-2 M-fM-^JM-^JM-dM-:M-^KM-dM-;M-6M-gM-1M-;M-eM-^^M-^KM-iM-^CM-(M-eM-^HM-^FM-hM-5M-^KM-eM-^@M-<M-gM-;M-^YINO_EVENT$
INO_FILE=$(echo $file | awk '{print $2}') # M-fM-^JM-^JinotifyM-hM->M-^SM-eM-^GM-:M-eM-^HM-^GM-eM-^IM-2 M-fM-^JM-^JM-fM-^VM-^GM-dM-;M-6M-hM-7M-/M-eM->M-^DM-iM-^CM-(M-eM-^HM-^FM-hM-5M-^KM-eM-^@M-<M-gM-;M-^YINO_FILE$
echo "-------------------------------$(date)------------------------------------"$
echo $file$
#M-eM-"M-^^M-eM-^JM- M-cM-^@M-^AM-dM-?M-.M-fM-^TM-9M-cM-^@M-^AM-eM-^FM-^YM-eM-^EM-%M-eM-.M-^LM-fM-^HM-^PM-cM-^@M-^AM-gM-'M-;M-eM-^JM-(M-hM-?M-^[M-dM-:M-^KM-dM-;M-6$
#M-eM-"M-^^M-cM-^@M-^AM-fM-^TM-9M-fM-^TM->M-eM-^\M-(M-eM-^PM-^LM-dM-8M-^@M-dM-8M-*M-eM-^HM-$M-fM-^VM--M-oM-<M-^LM-eM-^[M- M-dM-8M-:M-dM-;M-^VM-dM-;M-,M-iM-^CM-=M-hM-^BM-/M-eM-.M-^ZM-fM-^XM-/M-iM-^RM-^HM-eM-/M-9M-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-fM-^SM-^MM-dM-=M-^\M-oM-<M-^LM-eM-^MM-3M-dM-=M-?M-fM-^XM-/M-fM-^VM-0M-eM-;M-:M-gM-^[M-.M-eM-=M-^UM-oM-<M-^LM-hM-&M-^AM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-dM-9M-^_M-eM-^OM-*M-fM-^XM-/M-dM-8M-^@M-dM-8M-*M-gM-)M-:M-gM-^[M-.M-eM-=M-^UM-oM-<M-^LM-dM-8M-^MM-dM-<M-^ZM-eM-=M-1M-eM-^SM-^MM-iM-^@M-^_M-eM-:M-&M-cM-^@M-^B$
if [[ $INO_EVENT =~ 'CREATE' ]] || [[ $INO_EVENT =~ 'MODIFY' ]] || [[ $INO_EVENT =~ 'CLOSE_WRITE' ]] || [[ $INO_EVENT =~ 'MOVED_TO' ]] # M-eM-^HM-$M-fM-^VM--M-dM-:M-^KM-dM-;M-6M-gM-1M-;M-eM-^^M-^K$
then$
echo 'CREATE or MODIFY or CLOSE_WRITE or MOVED_TO'$
^I^I^I^I#INO_FILEM-eM-^OM-^XM-iM-^GM-^OM-dM-;M-#M-hM-!M-(M-hM-7M-/M-eM->M-^DM-eM-^SM-& -cM-fM- M-!M-iM-*M-^LM-fM-^VM-^GM-dM-;M-6M-eM-^FM-^EM-eM-.M-9$
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}$
#M-dM-;M-^TM-gM-;M-^FM-gM-^\M-^K M-dM-8M-^JM-iM-^]M-"M-gM-^ZM-^DrsyncM-eM-^PM-^LM-fM--M-%M-eM-^QM-=M-dM-;M-$ M-fM-:M-^PM-fM-^XM-/M-gM-^TM-(M-dM-:M-^F$(dirname ${INO_FILE})M-eM-^OM-^XM-iM-^GM-^O M-eM-^MM-3M-fM-/M-^OM-fM-,M-!M-eM-^OM-*M-iM-^RM-^HM-eM-/M-9M-fM-^@M-'M-gM-^ZM-^DM-eM-^PM-^LM-fM--M-%M-eM-^OM-^QM-gM-^TM-^_M-fM-^TM-9M-eM-^OM-^XM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^U(M-eM-^OM-*M-eM-^PM-^LM-fM--M-%M-gM-^[M-.M-fM- M-^GM-fM-^VM-^GM-dM-;M-6M-gM-^ZM-^DM-fM-^VM-9M-fM-3M-^UM-eM-^\M-(M-gM-^TM-^_M-dM-:M-'M-gM-^NM-/M-eM-"M-^CM-gM-^ZM-^DM-fM-^_M-^PM-dM-:M-^[M-fM-^^M-^AM-gM-+M-/M-gM-^NM-/M-eM-"M-^CM-dM-8M-^KM-dM-<M-^ZM-fM-<M-^OM-fM-^VM-^GM-dM-;M-6 M-gM-^NM-0M-eM-^\M-(M-eM-^OM-/M-dM-;M-%M-eM-^\M-(M-dM-8M-^MM-fM-<M-^OM-fM-^VM-^GM-dM-;M-6M-dM-8M-^KM-dM-9M-^_M-fM-^\M-^IM-dM-8M-^MM-iM-^TM-^YM-gM-^ZM-^DM-iM-^@M-^_M-eM-:M-& M-eM-^AM-^ZM-eM-^HM-0M-eM-9M-3M-hM-!M-!) M-gM-^DM-6M-eM-^PM-^NM-gM-^TM-(-RM-eM-^OM-^BM-fM-^UM-0M-fM-^JM-^JM-fM-:M-^PM-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-iM-^@M-^RM-eM-=M-^RM-eM-^HM-0M-gM-^[M-.M-fM- M-^GM-eM-^PM-^NM-iM-^]M-" M-dM-?M-^]M-hM-/M-^AM-gM-^[M-.M-eM-=M-^UM-gM-;M-^SM-fM-^^M-^DM-dM-8M-^@M-hM-^GM-4M-fM-^@M-'$
fi$
#M-eM-^HM- M-iM-^YM-$M-cM-^@M-^AM-gM-'M-;M-eM-^JM-(M-eM-^GM-:M-dM-:M-^KM-dM-;M-6$
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}@${server_ip}::${des}$
#M-gM-^\M-^KrsyncM-eM-^QM-=M-dM-;M-$ M-eM-&M-^BM-fM-^^M-^\M-gM-^[M-4M-fM-^NM-%M-eM-^PM-^LM-fM--M-%M-eM-7M-2M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-hM-7M-/M-eM->M-^D${INO_FILE}M-dM-<M-^ZM-fM-^JM-%no such or directoryM-iM-^TM-^YM-hM-/M-/ M-fM-^IM-^@M-dM-;M-%M-hM-?M-^YM-iM-^GM-^LM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-fM-:M-^PM-fM-^XM-/M-hM-"M-+M-eM-^HM- M-fM-^VM-^GM-dM-;M-6M-fM-^HM-^VM-gM-^[M-.M-eM-=M-^UM-gM-^ZM-^DM-dM-8M-^JM-dM-8M-^@M-gM-:M-'M-hM-7M-/M-eM->M-^DM-oM-<M-^LM-eM-9M-6M-eM-^JM- M-dM-8M-^J--deleteM-fM-^]M-%M-eM-^HM- M-iM-^YM-$M-gM-^[M-.M-fM- M-^GM-dM-8M-^JM-fM-^\M-^IM-hM-^@M-^LM-fM-:M-^PM-dM-8M--M-fM-2M-!M-fM-^\M-^IM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-oM-<M-^LM-hM-?M-^YM-iM-^GM-^LM-dM-8M-^MM-hM-^CM-=M-eM-^AM-^ZM-eM-^HM-0M-fM-^LM-^GM-eM-.M-^ZM-fM-^VM-^GM-dM-;M-6M-eM-^HM- M-iM-^YM-$M-oM-<M-^LM-eM-&M-^BM-fM-^^M-^\M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-hM-7M-/M-eM->M-^DM-hM-6M-^JM-iM-^]M- M-hM-?M-^QM-fM- M-9M-oM-<M-^LM-eM-^HM-^YM-eM-^PM-^LM-fM--M-%M-gM-^ZM-^DM-gM-^[M-.M-eM-=M-^UM-fM-^\M-^HM-eM-$M-^ZM-oM-<M-^LM-eM-^PM-^LM-fM--M-%M-eM-^HM- M-iM-^YM-$M-gM-^ZM-^DM-fM-^SM-^MM-dM-=M-^\M-eM-0M-1M-hM-6M-^JM-hM-^JM-1M-fM-^WM-6M-iM-^WM-4M-cM-^@M-^BM-hM-?M-^YM-iM-^GM-^LM-fM-^\M-^IM-fM-^[M-4M-eM-%M-=M-fM-^VM-9M-fM-3M-^UM-gM-^ZM-^DM-eM-^PM-^LM-eM--M-&M-oM-<M-^LM-fM-,M-"M-hM-?M-^NM-dM-:M-$M-fM-5M-^AM-cM-^@M-^B$
fi$
#M-dM-?M-.M-fM-^TM-9M-eM-1M-^^M-fM-^@M-'M-dM-:M-^KM-dM-;M-6 M-fM-^LM-^G touch chgrp chmod chownM-gM--M-^IM-fM-^SM-^MM-dM-=M-^\$
if [[ $INO_EVENT =~ 'ATTRIB' ]]$
then$
echo 'ATTRIB'$
if [ ! -d "$INO_FILE" ] # M-eM-&M-^BM-fM-^^M-^\M-dM-?M-.M-fM-^TM-9M-eM-1M-^^M-fM-^@M-'M-gM-^ZM-^DM-fM-^XM-/M-gM-^[M-.M-eM-=M-^U M-eM-^HM-^YM-dM-8M-^MM-eM-^PM-^LM-fM--M-%M-oM-<M-^LM-eM-^[M- M-dM-8M-:M-eM-^PM-^LM-fM--M-%M-gM-^[M-.M-eM-=M-^UM-dM-<M-^ZM-eM-^OM-^QM-gM-^TM-^_M-iM-^@M-^RM-eM-=M-^RM-fM-^IM-+M-fM-^OM-^OM-oM-<M-^LM-gM--M-^IM-fM--M-$M-gM-^[M-.M-eM-=M-^UM-dM-8M-^KM-gM-^ZM-^DM-fM-^VM-^GM-dM-;M-6M-eM-^OM-^QM-gM-^TM-^_M-eM-^PM-^LM-fM--M-%M-fM-^WM-6M-oM-<M-^LrsyncM-dM-<M-^ZM-iM-!M-:M-eM-8M-&M-fM-^[M-4M-fM-^VM-0M-fM--M-$M-gM-^[M-.M-eM-=M-^UM-cM-^@M-^B$
then$
rsync -avzcR --password-file=${rsync_passwd_file} $(dirname ${INO_FILE}) ${user}@${server_ip}::${des}$
fi$
fi$
^I^I$
^I^I#M-hM-.M-0M-eM-=M-^UM-fM-^WM-%M-eM-?M-^W$
^I^Iecho "${file} was rsynced at $(date "+%Y%m%d-%H%M%S")" >>${log_file} 2>&1$
done$
[root@localhost synch_backup_home]#
再次,执行脚本的时候,就不会再报错。
06、bash: telnet: 未找到命令...
在进行查看centos同windows是否网络,端口通顺的时候,采用的telnet,对telnet 进行安装
[root@localhost synch_backup_home]# telnet 192.168.2.165 873
bash: telnet: 未找到命令...
[root@localhost synch_backup_home]# yum install telnet
[root@localhost synch_backup_home]# telnet 192.168.2.165 873
Trying 192.168.2.165...
telnet: connect to address 192.168.2.165: Connection timed out
[root@localhost synch_backup_home]#
07、Connection timed out (110)
在后续备份到win10系统时,出现链接超时
[root@localhost synch_backup_home]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@10.131.19.1::syn_git_repo
rsync: failed to connect to 10.131.19.1 (10.131.19.1): Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
后续注意到,RsyncServer服务,默认为手动启用。需要自行开启一下。
08、failed: Permission denied
在后续备份到win10系统时,测试备份时,出现权限不足
[root@localhost synch_backup_home]# rsync -avz --password-file=/home/synch_backup_home/rsync.passwd /var/opt/gitlab/backups/ SvcCWRSYNC@10.131.19.1::syn_git_repo
sending incremental file list
./
rsync: failed to set times on "." (in syn_git_repo): Is a directory (21)
1631593206_2021_09_14_13.1.1-ee_gitlab_backup.tar
1631628454_2021_09_14_13.1.1-ee_gitlab_backup.tar
1631629033_2021_09_14_13.1.11-ee_gitlab_backup.tar
1631629779_2021_09_14_13.8.8-ee_gitlab_backup.tar
1631630383_2021_09_14_13.12.11-ee_gitlab_backup.tar
1631631132_2021_09_14_14.0.10-ee_gitlab_backup.tar
artifacts.tar.gz
builds.tar.gz
lfs.tar.gz
pages.tar.gz
uploads.tar.gz
repositories/
rsync: recv_generator: mkdir "repositories" (in syn_git_repo) failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
tmp/
rsync: recv_generator: mkdir "tmp" (in syn_git_repo) failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
rsync: mkstemp ".1631593206_2021_09_14_13.1.1-ee_gitlab_backup.tar.iqoASg" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".1631628454_2021_09_14_13.1.1-ee_gitlab_backup.tar.anwvhX" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".1631629033_2021_09_14_13.1.11-ee_gitlab_backup.tar.Ij9RSB" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".1631629779_2021_09_14_13.8.8-ee_gitlab_backup.tar.0mNbLu" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".1631630383_2021_09_14_13.12.11-ee_gitlab_backup.tar.0RM8K9" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".1631631132_2021_09_14_14.0.10-ee_gitlab_backup.tar.tSbni2" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".artifacts.tar.gz.ZKMT4E" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".builds.tar.gz.moPvCe" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".lfs.tar.gz.hL6l0p" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".pages.tar.gz.0aI5Ik" (in syn_git_repo) failed: Permission denied (13)
rsync: mkstemp ".uploads.tar.gz.60Alea" (in syn_git_repo) failed: Permission denied (13)
sent 4,477,282,745 bytes received 4,208 bytes 12,488,945.48 bytes/sec
total size is 8,965,583,099 speedup is 2.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
开始发现服务器时间超前,修改了服务器时间
[root@localhost synch_backup_home]# date
2021年 09月 14日 星期二 23:57:39 CST
[root@localhost synch_backup_home]# ntpdate 218.186.3.36
14 Sep 17:46:48 ntpdate[12639]: step time server 218.186.3.36 offset -22285.441950 sec
在同步时间后,重新创建了一个文件,发现还是错误,后续发现为在win10上授权为读取,非读取/写入.调整权限后同步正常。
四、相关链接
将gitlab的代码仓库实时备份到其他服务器
软件包——inotify+rsync 远程备份.7z
inotify-tools-3.14-9.el7.x86_64.rpm
Linux中手动执行shell脚本的方法
Linux基础篇之软件二进制包安装
/bin/bash^M: 坏的解释器: 没有那个文件或目录
Linux 定时任务
免密方式远程同步文件时ERROR:password file must not be other-accessible
linux如何查看端口被哪个进程占用?
wget命令详解
RSYNC @ERROR: AUTH FAILED ON MODULE BACKUP 解决思路及附录RSYNC常见问题及解决办法