将rsync与linux内核中的Inotify功能复用,达到实时监控同步数据,附带脚本

一直以来不想用rsync,之前dongnan向我推荐过一次,后来查了查感觉那会也用不上,自己安装一下,试了试感觉没啥太好的地方,而主要是当你文件比较多的时候会在速度很资源上有多余浪费,所以一直也没用(就好比,你拷贝1G的文件,如果里面有上万个小文件。那这个速度肯定比不上一个1G的大文件一次性传输快了。这时候谁管你用的是固态还是高速硬盘)。
但这次实在没办法,同机备份,我也懒得自己写脚本了,干脆就整个目录每次备份吧。这次有些事情,没办法如果用脚本的话会很不方便,所以跟linux内核内的inotify配合达到实时备份的作用

什么是rsync
Rsync,Remote Synchronize,意思很明显就是远程同步软件。该软件能够在同步文件的同时,保持文件的权限、时间、软硬链接等一些信息。
地址:http://rsync.samba.org/

windows下请转战cwRsync

rsync 包括如下的一些特性:

能更新整个目录和树和文件系统;
有选择性的保持符号链链、硬链接、文件属于、权限、设备以及时间等(它只更新那里不一样的文件,相同的文件它会直接跳过去的<大量时如上面提到的~~慢死你>);
对于安装来说,无任何特殊权限要求;
对于多个文件来说,内部流水线减少文件等待的延时;
能用rsh、ssh 或直接端口做为传输入端口;
支持匿名rsync 同步文件,是理想的镜像工具;
加密传输数据,保证了数据的安全性;

rsync 的一些不足:

当文件数量达到了十万甚至千万量级,扫描所有文件将是非常耗时(谁让它是进行差量比对传输呢);
不能实时的去监测、同步数据,当然可以通过一些方式进行触发让其进行数据同步(但你觉得两次难道不会有有时间差吗?这个差值大小原因,请看看上一条后自行分析);

本文不讲解同步到其他服务器,仅仅本地同步(到服务器端其实操作差不多,唯一就是添加标签以及一些参数等)

[root@kinggoo.com src]# wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.5.tar.gz
[root@kinggoo.com src]# tar -zxvf rsync-3.0.5.tar.gz
[root@kinggoo.com src]# cd  rsync-3.0.5
[root@kinggoo.com src]# mkdir /opt/{rsync,../etc/rsyncd}
[root@kinggoo.com rsync-3.0.5]# ./configure --prefix=/opt/rsync/ && make && make install

#创建配置文件{(rsync.conf:服务的主要配置文件),(rsyncd.secrets:存储rsync服务的用户名和密码的,它是一个明文的文本文件,权限仅所有者可写),(rsyncd.motd:服务的欢迎信息)}

[root@kinggoo.com rsync-3.0.5]# touch /etc/rsyncd/{rsyncd.conf,rsyncd.secrets,rsyncd.motd}
[root@kinggoo.com rsync-3.0.5]# useradd rsync
[root@kinggoo.com rsync-3.0.5]# cat /etc/rsyncd/rsyncd.conf
port = 873
list = true
uid = rsync
gid = rsync
read only = true
#max connections = 2 自己本机无所谓
timeout = 600
hosts allow = 127.0.0.1
#secrets file = /etc/rsyncd.secrets 因为自己使用所以注释掉了
#motd file = /etc/rsyncd.motd 因为自己使用所以注释掉了
log format = %t %p %a %m %f %i %o %b
syslog facility = local3
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock

启动一下下

[root@kinggoo.com rsync-3.0.5]# rsync --daemon --config=/etc/rsyncd/rsyncd.conf 
[root@kinggoo.com rsync-3.0.5]# ps -fe |grep  rsyncd
root     16385     1  0 17:08 ?        00:00:00 rsync --daemon --config=/etc/rsyncd/rsyncd.conf
执行一下本地数据同步
[root@kinggoo.com rsync-3.0.5]# rsync -avr --progress --delete 源目录 目标目录

修改rsync服务文件

[root@kinggoo.com test2]# cat /etc/xinetd.d/rsync     
# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
service rsync
{
        disable = no
        flags           = IPv6
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/bin/rsync
        server_args     = --daemon
        log_on_failure  += USERID
}

什么是Inotify

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。

而inotify-tools则是 inotify 的一个简单接口。同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。现在介绍一下它的使用方法。

具体参数,请检索文中的【inotify-tools工具的语法参数】部分

下载、安装

[root@kinggoo.com src]# wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
[root@kinggoo.com src]# cd inotify-tools-3.13
[root@kinggoo.com inotify-tools-3.13]# ./configure --prefix=/usr && make &&make install

安装正确后,会有如下两个二进制文件 inotifywait(监控) inotifywatch(统计)

实验一下

[root@kinggoo.com src]# inotifywatch -v -e access -e modify -e create -t 60 -r  /home/

如果你是64位,会有如下错误提示

inotifywatch: error while loading shared libraries: libinotifytools.so.0: cannot open shared object file: No such file or directory

通过软连接到lib64里

ln -s /usr/lib/libinotifytools.so.0  /usr/lib64/libinotifytools.so.0 

然后正常执行(你人工对home目录下做任意操作,连接、修改、创建),会有如下提示access、 modify、 create分别操作几次

Establishing watches...
Setting up watch(es) on /home/
OK, /home/ is now being watched.
Total of 17 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 160 seconds.

total  access  modify  create  filename
15     11      2       2       /home/username/

执行监控命令inotifywait,并且我使用linux系统帐号再次重新登陆,发现home下的变化如下,如果想一直监控就把-t换为-m即可。

root@kinggoo.com local]# inotifywait -rm  /home
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/home/username/ OPEN .bash_profile
/home/username/ ACCESS .bash_profile
/home/username/ CLOSE_NOWRITE,CLOSE .bash_profile
/home/username/ OPEN .bashrc
/home/username/ ACCESS .bashrc
/home/username/ CLOSE_NOWRITE,CLOSE .bashrc
/home/username/ OPEN .bash_history
/home/username/ ACCESS .bash_history
/home/username/ CLOSE_NOWRITE,CLOSE .bash_history
/home/username/ OPEN .bash_history
/home/username/ ACCESS .bash_history
/home/username/ CLOSE_NOWRITE,CLOSE .bash_history

不管是inotifywait还是inotifywatch都有-e参数,-e有以下事件动作

access 文件读取
modify 文件更改。
attrib 文件属性更改,如权限,时间戳等。
close_write 以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。
close_nowrite 以只读模式打开的文件被关闭。
close 文件被关闭,不管它是如何打开的。
open 文件打开。
moved_to 一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。
moved_from 一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。
move 包括moved_to和 moved_from
move_self 文件或目录被移除,之后不再监听此文件或目录。
create 文件或目录创建
delete 文件或目录删除
delete_self 文件或目录移除,之后不再监听此文件或目录
unmount 文件系统取消挂载,之后不再监听此文件系统。



有个问题是,我发现中文的文件会提示错误,字符类型什么,我也懒得查明了。估计是因为我的rsync目标盘是挂载的windows ntfs硬盘的原因。使用–iconv=utf8,iso88591 –protect-args 等等都不行 起了个怪了!

下面写了个脚本,用来监控有变动的文件

需要配置_rsync_bin、_info、_source、_object、_parameter、_log四个变量即可

后台执行:

sh rsyncinotify.Monitor &

rsyncinotify.Monitor脚本内容 下载

#!/bin/bash
# 说明:利用Linux内核内的inotify功能监控系统文件变化,并通过rsync达到时时同步的作用。
# 作者:tscccn
# 博客地址: http://kinggoo.com
# 本文地址:http://kinggoo.com/rsync-inotify.htm
# 配置:(_object、_source为数组)
# 执行:sh rsyncinotify.Monitor
# 注意:如果提示date: extra operand `**'问题,请修改变量_time为_time=`date +%Y%m%d-%H:%M`
declare -a _source _object
_time=`date +%Y-%m-%d\ %H:%M`

# 以下需要配置_rsync_bin、_info、_source、_object、_parameter、_log四个变量即可
# rsync可执行文件位置,如果已添加到PATH内,则不需要修改
_rsync_bin="rsync"

# 可以自己修改参数_parameter。当_info设置为1时,_parameter失效
_parameter="-qar --progress --delete"
# _info:是否输出日志及错误信息 1/不输出、0/输出
_info=0

# _log:详细日志信息
_log="/var/log/rsync.tlog"

# _source:需要被同步的文件夹或文件
#( '第一个目录' '第二个目录' '第三个目录' '第...个目录' ) 
# 注意:在每个源路径如果不在最后加"/",则会将该文件夹下的文件同步到_object对应目录下,如果添加则会将改文件夹同步到_object对应目录下
# 举例:如填写_source是"/home",_object是"/tmp/test/" 。在rsync后,会在/tmp/test/下出现"home"文件夹,\ 
#       若:_source是"/home/"则rsync后会在"/tmp/test/"下生成"/home/"目录下的所有文件夹
_source=( "/data0" "/opt" "/etc" )

# _object:要同步到的位置(如果是想同步到其他服务器,请改下脚本)
#( '第一个目标路径' '第二个目标路径' '第三个目标路径' '第...目标路径' )
# 请写对路径及文件,脚本内并未对错误路径做处理
_object=( "/mnt/windows/RSYNC/" "/mnt/windows/RSYNC/" "/mnt/windows/RSYNC/" )

#

# 判断是否输出日志,或者是否能正确输出
if (( $_info ));then
	_log="/dev/null"
	_parameter="-ar --delete"
fi
# 判断两组数组个数是否配置正确
if (( ${#_source[@]} != ${#_object[@]} )) ;then
	echo "ERROR -- >> ${_time} -- 原文件夹路径与目标文件夹路径配置错误" >> ${_log}
	exit -1
fi
_rsync="${_rsync_bin}"
# 初始化合并源文件夹路径数组内数据到变量内,数组元素之间空格分割,并同步
echo "${_time} -- >> 开始监控已配置文件路径 ${_for_source}" >> ${_log}
${_rsync_bin} --daemon --config=/etc/rsyncd/rsyncd.conf &
for(( i=0;$i<${#_source[@]};i++ )) 
do
	test -d ${_source[$i]} || echo "${_time} -- >> WARN -- 文件夹 ${_source[$i]} 未找到或不存在" >> ${_log} 2>&1
	test -d ${_object[$i]} || mkdir -p ${_object[$i]}
	${_rsync} ${_parameter} ${_source[$i]} ${_object[$i]} &>> ${_log} &
	_for_source="${_for_source} ${_source[$i]}"
done
#标记开始
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M' --format '%T %w%f %e ' -e modify,delete,move,create,attrib ${_for_source}  | \
while read _date _time _dirpath _status
do
		#对已配置源文件夹路径数组循环匹配 _dirpath 数据是否相同
		for(( i=0;$i<${#_source[@]};i++ )) 
		do
			echo ${_dirpath} |grep -P -o -i "^${_source[$i]}?" >/dev/null && _go=1 || _go=0 
			if(( ${_go} ));then
				# 因为汉字编码问题,如果是用后台执行rsync的话,可能会比较暂用cpu等资源,所以建议使用
				${_rsync} ${_parameter} ${_source[$i]} ${_object[$i]} &>> ${_log} &&
				# ${_rsync} ${_parameter} ${_source[$i]} ${_object[$i]} &>> ${_log} &
				echo "${_date} ${_time} ${_dirpath} ${_status}" >> ${_log}
				break 1
			fi
		done
		# 等3秒,让数据飞一会
		sleep 3
done

参考资料:

rsync部分

核心算法介绍:
假定在名为α和β的两台计算机之间同步相似的文件 A 与 B ,其中α对文件 A 拥有访问权,β对文件 B 拥有访问权。并且假定主机α与β之间的网络带宽很小。那么 rsync 算法将通过下面的五个步骤来完成:
1. β将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
2. β对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验。
3. β将这些校验结果发给α。
4. α通过搜索文件 A 的所有大小为 S 的数据块 ( 偏移量可以任选,不一定非要是 S 的倍数 ) ,来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
5. α发给β一串指令来生成文件 A 在β上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。
–此算法参考自http://www.iteye.com/topic/604436

Rsync的命令格式可以为以下六种:

1)rsync [OPTION]... SRC DEST
拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /data1 /backup
2)rsync [OPTION]... SRC [USER@]HOST:DEST
使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -avz *.c foo:src
3)rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://kinggoo.com/www
4)rsync [OPTION]... [USER@]HOST:SRC DEST
使用远程shell程序(如rsh、ssh等)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -avz foo:src/kinggoo /data1
5)rsync [OPTION]... [USER@]HOST::SRC DEST
从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av root@kinggoo.com::www /data1
6)rsync [OPTION]... SRC [USER@]HOST::DEST
从本地拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /data1 root@kinggoo.com::www

Rsync 参数选项说明:

-v, --verbose 详细模式输出 
-q, --quiet 精简输出模式
	--no-motd 后台输出调试信息模式
-c, --checksum 打开校验开关,强制对文件传输进行校验 
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD 
	--no-OPTION 关闭某一个隐藏的选项
-r, --recursive 对子目录以递归模式处理 
-R, --relative 使用相对路径信息    
	rsync foo/bar/foo.c remote:/tmp/
	rsync 参数在/tmp目录下创建foo.c文件,而如果使用-R参数:
	rsync -R foo/bar/foo.c remote:/tmp/
	Rsync 参数会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。
	--no-implied-dirs 不使用路径中的一些目录
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀
--backup-dir 将备份文件存放在某目录下
-suffix=SUFFIX 定义需要备份的文件前缀 
-u, --update 也就是跳过所有已经的文件(不覆盖已更新的文件) 

-l, --links 保留软链结 
-L, --copy-links 想对待常规文件一样处理软链结 
--copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结 
--safe-links 忽略指向SRC路径目录树以外的链结 
-H, --hard-links 保留硬链结 
-p, --perms 保持文件权限 
-o, --owner 保持文件属主信息 
-g, --group 保持文件属组信息 
-D, --devices 保持设备文件信息 
-t, --times 保持文件时间信息 
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间 
-n, --dry-run现实哪些文件将被传输 
-W, --whole-file 拷贝文件,不进行增量检测 
-x, --one-file-system 不要跨越文件系统边界 
-B, --block-size=SIZE 检验算法使用的块尺寸,默认是700字节 
-e, --rsh=COMMAND 指定替代rsh的shell程序 
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息 
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件 
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件 
--delete 删除那些DST中SRC没有的文件 
--delete-excluded 同样删除接收端那些被该选项指定排除的文件 
--delete-after 传输结束以后再删除 
--ignore-errors 及时出现IO错误也进行删除 
--max-delete=NUM 最多删除NUM个文件 
--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输 
--force 强制删除目录,即使不为空 
--numeric-ids 不将数字的用户和组ID匹配为用户名和组名 
--timeout=TIME IP超时时间,单位为秒 
-I, --ignore-times 不跳过那些有同样的时间和长度的文件 
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间 
--modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口,默认为0 
-T --temp-dir=DIR 在DIR中创建临时文件 
--compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份 
-P 等同于 --partial 
--progress 显示备份过程 
-z, --compress 对备份的文件在传输时进行压缩处理 
--exclude=PATTERN 指定排除不需要传输的文件模式 
--include=PATTERN 指定不排除而需要传输的文件模式 
--exclude-from=FILE 排除FILE中指定模式的文件 
--include-from=FILE 不排除FILE指定模式匹配的文件 
--version 打印版本信息 
--address 绑定到特定的地址 
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件 
--port=PORT 指定其他的rsync服务端口 (默认是873)
--blocking-io 对远程shell使用阻塞IO 
-stats 给出某些文件的传输状态 
--log-format=FORMAT 指定日志文件格式 (在rsyncd.conf设定)
--password-file=FILE 从FILE中得到密码 
--bwlimit=KBPS 限制I/O带宽,KBytes per second 
-h, --help 显示帮助信息

rsync.conf配置中log format的参数

log format

This parameter allows you to specify the format used for logging file transfers when transfer logging is enabled. The format is a text string containing embedded single-character escape sequences prefixed with a percent (%) character. An optional numeric field width may also be specified between the percent and the escape letter (e.g. "%-50n %8l %07p").

The default log format is "%o %h [%a] %m (%u) %f %l", and a "%t [%p] " is always prefixed when using the "log file" parameter. (A perl script that will summarize this default log format is included in the rsync source code distribution in the "support" subdirectory: rsyncstats.)

The single-character escapes that are understood are as follows:

%a the remote IP address 远程IP地址
%b the number of bytes actually transferred 传输字节数
%B the permission bits of the file (e.g. rwxrwxrwt) 该文件的权限位
%c the total size of the block checksums received for the basis file (only when sending) 为基础的块校验接收文件的总大小,仅发送成功
%f the filename (long form on sender; no trailing "/") 文件名字
%G the gid of the file (decimal) or "DEFAULT" 文件gid
%h the remote host name 远程主机名
%i an itemized list of what is being updated 被更新的详细列表
%l the length of the file in bytes 该文件的长度(以字节为单位)
%L the string " -> SYMLINK", " => HARDLINK", or "" (where SYMLINK or HARDLINK is a filename)
%m the module name 该模块的模块名
%M the last-modified time of the file 文件的最后修改时间
%n the filename (short form; trailing "/" on dir)
%o the operation, which is "send", "recv", or "del." (the latter includes the trailing period) 操作,是 “发送”,“接收”,或“删除”。
%p the process ID of this rsync session 会话id
%P the module path 该模块的路径
%t the current date time 当前的日期时间
%u the authenticated username or an empty string 认证的用户名或留空
%U the uid of the file (decimal) 该文件的UID(十进制)

inotify-tools工具的语法参数

inotifywait
语法:
inotifywait [-hcmrq] [-e ] [-t ] [–format ] [–timefmt ] [ … ]
参数:
-h,–help
输出帮助信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, –monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, –daemon
跟–monitor一样,除了是在后台运行,需要指定–-outfile把事情输出到一个文件。也意味着使用了–syslog。
-o, –outfile
输出事情到一个文件而不是标准输出。
-s, –syslog
输出错误信息到系统日志
-r, –recursive
监视一个目录下的所有子目录。
-q, –quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-t , –timeout
设置超时时间,如果为0,则无限期地执行下去。
-e , –event
指定监视的事件。
-c, –csv
输出csv格式。
–timefmt
指定时间格式,用于–format选项中的%T格式。
–format
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式

inotifywatch
语法:
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ … ]
参数:
-h, –help
输出帮助信息
-v, –verbose
输出详细信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z, –zero
输出表格的行和列,即使元素为空
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-r, –recursive
监视一个目录下的所有子目录。
-t , –timeout
设置超时时间
-e , –event
只监听指定的事件。
-a , –ascending
以指定事件升序排列。
-d , –descending
以指定事件降序排列。

UTC、GMT与DST

目前世界上常见的计时方式主要有:太阳时(MT)和原子时。GMT(格林尼治时间)的正午是指当太阳横穿格林尼治子午线时的时间,由于地球的自转呈现不规则性,并且正在缓慢减速,因此格林威治时间目前已经不再作为标准时间使用,取而代之的是协调时间时(UTC),它是由原子钟提供,它是基于标准的GMT提供的准确时间,若在不需要精确到秒的前提下,通常也将GMT与UTC视作等同。

DST(daylight saving time)也称为夏令时,它是以节约能源为目的而人为规定的一种制度,它规定某段时间作为夏令时间,并在标准时间的基础上提前多长时间(通常是一个小时),同时DST还规定了规定生效的起始时间和末尾时间,详细规则会在tzset函数中介绍,值得注意的是目前只是部分国家实施了夏令时制度。

标准时间是相对于UTC/GMT时间而言的,它在UTC/GMT之上增加了时区信息,比如中国标准时间是GMT+8,即在UTC时间上增加8个小时。

参考资料:

http://rsync.samba.org/

http://www.samba.org/ftp/rsync/rsyncd.conf.html

- THE END -
版权声明:
转载原创文章请注明,文章出处:http://kinggoo.com
原文地址:http://kinggoo.com/rsync-inotify.htm
发表评论?

13 条评论。

  1. 同步大文件后 文件的MD5变了
    http://blog.sina.com.cn/s/blog_71261a2d0100xslx.html
    使用modify 可以解决

  2. #标记开始
    ## inotifywait 这一行是监控 变量_for_source所设置文件夹内文件信息是否有modify,delete,move,create,attrib变动 然后将变动信息交给while循环
    inotifywait -mrq –timefmt ‘%Y-%m-%d %H:%M’ –format ‘%T %w%f %e ‘ -e modify,delete,move,create,attrib ${_for_source} | \
    while read _date _time _dirpath _status
    ## while 是来读取inotifywait 监控每个每次变动信息,给_date _time _dirpath _status
    do
    ## 对已配置源文件夹路径数组循环匹配 _dirpath 数据是否相同
    for(( i=0;$i< ${#_source[@]};i++ )) do ## 监控数据是否含有同步源的路径(当_source数据内添加多个监控路径,而只有其中一个被监控路径下有变化时执行对应同步\ 为了减少无用同步次数) echo ${_dirpath} |grep -P -o -i "^${_source[$i]}?" >/dev/null && _go=1 || _go=0
    if(( ${_go} ));then
    ## 因为汉字编码问题,如果是用后台执行rsync的话,可能会比较暂用cpu等资源,所以建议使用(同步完一个后在去下一个)
    ## 我自己服务器上用的是下面这串,多了–iconv ,需要安装iconv支持
    ## ${_rsync} ${_parameter} –iconv=”UTF-8″,GB18030 ${_source[$i]} ${_object[$i]} &>> ${_log} &&
    ${_rsync} ${_parameter} ${_source[$i]} ${_object[$i]} &>> ${_log} &&
    ## ${_rsync} ${_parameter} ${_source[$i]} ${_object[$i]} &>> ${_log} &
    #—
    ## 以一定格式记录日志
    echo “${_date} ${_time} ${_dirpath} ${_status}” >> ${_log}
    break 1
    fi
    done
    # 等3秒,让数据飞一会
    sleep 3
    done

  3. ‘: not a valid identifierncinotify.Monitor: line 2: declare: `_object
    ‘syncinotify.Monitor: line 21: syntax error near unexpected token `
    ‘syncinotify.Monitor: line 21: `for(( i=0;$i<${_source[@]};i++ ))
    脚本运行出错,请教下是什么问题呢

    • _object=( “/mnt/windows/RSYNC/” “/mnt/windows/RSYNC/” “/mnt/windows/RSYNC/” )
      应该是这里 你设置有问题,请检查,或者把你脚本内容发送到邮件。标题不要直接写文章地址,会被拉黑的

  4. 博主,你好。谢谢你的分享,让我很受启发。不过还有点问题小女子想要请教你,能否加个qq请教一下。QQ:914855723

  5. 楼主辛苦了,你搜索下 sersync

  6. 拜访,谢谢博主分享!欢迎来小站坐坐!

  7. 拜访,谢谢博主分享!欢迎来小站坐坐!

  8. 博主辛苦,谢谢分享!

发表评论