CentOS等Linux服务器配置使用Rsync同步及Crontab定时任务

Rsync介绍
我们经常需要在不同目录或者服务器之间做文件同步和更新,Linux提供了很多内置命令可以使用比如scp等等,但是今天我们介绍一个更加强大的工具rsync。rsync命令是一个远程同步工具,可以通过AN\WAN快速同步多台主机间的文件,它使用的就是rsync算法达到本地和远程两个主机之间文件同步,该算法是增量算法,即只同步两个文件的不同部分,而不是每次同步整个文件,所以速度是相当快.

注:本文主要以CentOS6为例

Rsync的使用

1.先检查是否安装了rsync和xinetd, 如果没有使用如下命令安装:
检查命令

#rpm -qa | grep rsync
#rpm -qa | grep xinetd

安装命令

#yum install rsync xinetd

2.配置xinetd:

#vi /etc/xinetd.d/rsync

#disable = yes修改为
disable = no

3.以 xinetd 运行 rsync 服务:

①以 xinetd 运行 rsync 服务

CentOS 默认以 xinetd 方式运行 rsync 服务。rsync 的 xinetd 配置文件
在 /etc/xinetd.d/rsync。要配置以 xinetd 运行的 rsync 服务需要执行如下的命令:

# chkconfig rsync on
# service xinetd restart

管理员可以修改 /etc/xinetd.d/rsync 配置文件以适合您的需要。例如,您可以修改配置行

server_args = --daemon

在后面添加 rsync 的服务选项。

②独立运行 rsync 服务

最简单的独立运行 rsync 服务的方法是执行如下的命令:

# /usr/bin/rsync --daemon

您可以将上面的命令写入 /etc/rc.local 文件以便在每次启动服务器时运行 rsync 服务。当然,您也可以写一个脚本在开机时自动启动 rysnc 服务。

4.编辑rsyncd.conf配置文件:

#vim /etc/rsyncd.conf

无密码同步

#This is the rsync daemon configuration 

#global settings 
pid file = /var/run/rsyncd.pid
port = 873
lock file = /var/run/rsyncd.lock
log file = /var/log/rsync.log
gid = root
uid = root

#module settings 
[backup]
path = /opt/lampp/htdocs
use chroot = no
max connections = 15
read only = no
write only = no
list = no
ignore errors = yes
timeout = 120

无密码客户端使用

#rsync -avz --progress user@server::backup/sitedir

有密码登录

#This is the rsync daemon configuration 

#global settings 
pid file = /var/run/rsyncd.pid
port = 873
lock file = /var/run/rsyncd.lock
log file = /var/log/rsync.log
gid = root
uid = root

#module settings 
[backup]
path = /opt/lampp/htdocs
use chroot = no
max connections = 15
read only = no
write only = no
list = no
ignore errors = yes
timeout = 120
auth users = root
secrets file = /etc/rsyncd.passwd
#echo "root:password123" > /etc/rsyncd.passwd 
#chmod 600 /etc/rsyncd.passwd

有密码客户端使用:

#echo "password123" > /home/backup/cron/rsyncd.passwd 
#chmod 600 /home/backup/cron/rsyncd.passwd 
#rsync -avz --progress --password-file=/home/backup/cron/rsyncd.passwd  root@server::backup/sitedir /home/www

或者使用环境变量

#export RSYNC_PASSWORD="password123"
#rsync -avz --progress hadoop@server::backup/sitedir /home/www

6.将rsync放入crontab计划任务,每天同步一次, 写一个shell脚本backup.sh,把此脚本写入/etc/crontab
backup.sh参考如下:

#!/bin/bash

touch /home/backup/rsyncbak.log

echo $(date +%Y"-"%m"-"%d" "%k":"%M":"%S)" Rsync Backup Started." >> /home/data/backup/rsyncbak.log

rsync -e 'ssh -p 22' -vzrtopg --progress --delete root@185.125.52.118:/home/wwwroot/database/* /home/backup/database/
rsync -e 'ssh -p 22' -vzrtopg --progress --delete root@185.125.52.118:/home/wwwroot/site/* /home/backup/site/

echo $(date +%Y"-"%m"-"%d" "%k":"%M":"%S)" Rsync Backup Succeeded." >> /home/backup/rsyncbak.log

或者登陆root用户, 使用如下命令执行backup.sh加入计划任务:

#crontab -e

添加内容:

#Backup site and database (daily at 2:00)
0 2 * * * root /home/backup/cron/backup.sh

7.crontab使用注意事项

注意环境变量问题
有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。
在 crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程 序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这 样,系统执行任务调度时就没有问题了。

不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

系统级任务调度与用户级任务调度
系 统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。

附录一 : rsync通过include与exclude实现精确同步

说明:
有一个目录/var/www/test/public/下面,有很多文件、目录,但我只需要同步其中的2个目录(js,css)。用exclude将其它的文件,目录排除当然是可以的,但因为其它文件,目录非常多,在exclude中排除明显太费时;或2行rsync直接同步/var/www/test/public/js,/var/www/test/public/css也是可以的。
类似rsync -nrv /var/www/feibo/fbtime_in/public/js /tmp/test/public这样,写2行
但如果我只想要1行rsync同步/var/www/test/public目录呢。这里,我就需要先include-from指定需要同步的文件或目录,exclude将/var/www/test/public所有文件、目录排除掉实现:
1.编写/root/shell/test.include文件

# cat /root/shell/test.include
js
css

2.rsync同步指定文件,目录

# rsync -nrv  --include-from=/root/shell/test.include --exclude=/* /var/www/test/public/ /tmp/test/public
-n, --dry-run               perform a trial run with no changes made  //干跑,光显示哪些文件目录会被rsync而不运行,用于测试非常方便
-r, --recursive             recurse into directories  //详细模式输出
-v, --verbose               increase verbosity  //对子目录以递归模式处理

参照网上写的,rsync -nrv –include-from=/root/shell/test.include –exclude=* /var/www/test/public/ /tmp/test/public,发现任何文件都没有同步。原来–exlucde=*是不行的,需要指定–exclude=/*。估计意思是指当前目录/var/www/test/public/下的所有文件目录。–exclude=*/则是指定当前目录/var/www/test/public/下的所有目录。
这里要注意/var/www/test/public/需要添加最后的/

执行的结果如下,可以看到只有js,css目录被rsync

sending incremental file list
css/global.css
css/global.css_bak
js/a
js/feibo.js
js/feibo.js_bak
js/global.js
js/swfupload.js
js/swfuploadhandlers.js
js/WdatePicker/skin/whyGreen/img.gif
js/zero/ZeroClipboard.js

sent 1045 bytes  received 126 bytes  2342.00 bytes/sec
total size is 947225  speedup is 808.90 (DRY RUN)

附录二 : 更多Rsync参数介绍
-v, –verbose 详细模式输出
-q, –quiet 精简输出模式
-c, –checksum 打开校验开关,强制对文件传输进行校验
-a, –archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-r, –recursive 对子目录以递归模式处理
-R, –relative 使用相对路径信息
-b, –backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用–suffix选项来指定不同的备份文件前缀。
–backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-u, –update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-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、ssh方式进行数据同步
–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服务端口
–blocking-io 对远程shell使用阻塞IO
-stats 给出某些文件的传输状态
–progress 在传输时现实传输过程
–log-format=formAT 指定日志文件格式
–password-file=FILE 从FILE中得到密码
–bwlimit=KBPS 限制I/O带宽,KBytes per second
-h, –help 显示帮助信息

相关文章:
Linux使用expect和rsync实现无人值守自动同步
CentOS下使用Rsync和Crontab实现无人值守定时同步
CentOS等Linux服务器配置使用Rsync同步及Crontab定时任务

2条评论

发表评论