Linux定时增量更新文件--转
http://my.oschina.net/immk/blog/193926 动机与需求:现在有两台服务器A和B,由于A的存储随时会挂(某些原因),所以需要B机器上有A的备份,并且能够与A同步更新 一、crontab定时任务 发现了crontab这个东西 简单实践了一下,把使用的过程写到下面: 首先是编辑一个文件,这个文件在一个很不好找的位置,但crontab提供了一个命令可以直接用vi打开这个文件 crontab -e 文件打开以后要在文件末尾加上一行: * * * * * mkdir /usr/local/test >/home/log.txt 2>&1 总共分为三个部分,首先是5个星星,格式是?分钟?小时?日期?月份?星期几 举个例子应该就明白了: 59 23 * * 5 这个意思是每周五的23点59分执行一下后面的这个命令 mkdir /usr/local/test 就是要执行的命令 >/home/log.txt 2>&1 则是指定命令执行时输出的信息放到/home/log.txt这个文件里,2>&1是指将标准输出转换到文件流 如果只有命令而不指定输出日志文件的话,在crontab的日志里可能会报错: ?(CRON) info (No MTA installed,discarding output) 这是因为你的机器没有安装任何的邮件发送的软件,也就是MTA,而crontab是默认要将输出的信息以邮件的形式发送的,所以就会有这样的错误 说到crontab的日志,系统是ubuntu12.04 默认位置是/var/log/cron.log这个文件 如果没有,那么可能要修改一下rsyslog里的配置文件,文件位置是 /etc/rsyslog.d/50-default.conf 将这一行注释前面的“#”去掉即可(原来是注释掉的,所以没有日志文件) #cron.* ? /var/log/cron.log 然后重启rsyslog服务 service rsyslog restart 对于CentOS,rsyslog的配置文件是/etc/rsyslog.conf,里面关于cron的日志输出这一项没有被注释掉 所以不用改,默认的执行日志文件为:/var/log/cron ? 二、rsync增量更新 然后是文件的增量更新,主要解决的问题是现在有两台服务器A和B,要将A服务器上的test目录增量复制到B服务器上的test目录(所谓增量更新就是指B服务器原来已经有的文件不再传了,只传送那些A有的而B没有的),这样使得B服务器上的test文件夹保持与A同步 这就需要用到rsync这个命令,这个命令的用法跟scp是一样的 比如在A服务器下执行命令:rsync -r /home/test/ user@B:/home/test 即可实现增量更新 注意:这里有一个问题需要详细说明一下: 假如test目录下有1.txt,2.txt这两个文件 如果命令中源目录那里写成这样:/home/test/ 那么rsync准备更新的文件列表就是 1.txt 2.txt 然后就会在B机器的/home/test目录下找这两个文件并做增量更新,这样能够满足需求 但如果源目录写成这样:/home/test 那么rsync准备增量更新的文件列表就会是这样: test/1.txt test/2.txt 然后在B机器的/home/test目录下寻找test/1.txt,发现没有test文件夹,于是又创建了test文件夹,所以这样执行的结果就是B机器的目录结构就会有这两个文件,而这不是希望看到的 /home/test/test/1.txt /home/test/test/2.txt 所以要注意这个问题。下面两种写法是正确的: rsync -r /home/test/ user@B:/home/test? 或者 rsync -r /home/test user@B:/home ? 具体的关于rsync的详细参数的设置这里就不说了,这里只把一种推荐的命令运行方式记录下来: rsync -rtv /home/test/ user@B:/home/test -t是指判断文件是否已有的时候只判断文件的时间戳和文件的大小,如果都一样就把这个文件跳过(这是一种不够严谨但足够快的方法) -v是指输出一下执行的日志,其实可以加很多v,v越多,输出的日志越多 ? 三、免验证访问 现在就可以将crontab和rsync结合一下了,当然首先需要解决两个机器之间rsync免验证的问题,也就是命令可以直接这样写(不需要B机器的用户名和密码): rsync -rtv /home/test user@B:/home/test 关于这个网上看了一些rsync的配置,但是觉得太麻烦了,想到这个跟scp差不多,是不是也可以直接ssh免验证的那种方式解决,试了一下,可行 关于ssh免验证登录,是这样做的(这里的用户全部用root,当然可以用其他的): 在A机器下: 首先生成秘钥文件 ssh-keygen?-t?rsa?-P '' 注意‘’是两个单引号,表示密码为空 然后将生成的id_rsa.pub文件复制到B服务器上(注意文件的位置为/root/.ssh,如果是其他用户应该是/home/user/.ssh,即为当前用户的主目录) scp /root/.ssh/id_rsa.pub root@B:/root/ (因为操作还没有完成,这里还要输入密码) 然后在B机器上操作: 如果/root/.ssh/里没有authorized_keys这个文件,那么将从A机器scp过来的id_rsa.pub文件移动并重命名成authorized_keys即可 mv /root/id_rsa.pub /root/.ssh/authorized_keys 如果这个authorized_keys文件已经存在,那么将id_rsa.pub这个文件的内容追加到authorized_keys即可 cat /root/id_rsa.pub >> /root/.ssh/authorized_keys 此时就可以在A机器上免密码访问B机器了,注意别搞反了 在A机器上测试一下: ssh root@B 如果不需要输入密码就可以登录,说明配置成功 ? 四、综合 OK,准备工作都完成了,下面就可以实现需求了,在A机器下: 1、crontab -e打开crontab的配置文件 2、在最后一行加入下面的代码 0 0,6,12,18 * * * rsync -rvt /app/elearndata/ root@inc204:/home/elearndata >>/home/updateLog.txt 2>&1 注意inc204是我的B机器名,需要在A机器的hosts下面配置其IP映射,当然也可以直接用ip代替 这句代码的意思是每6个小时(在0点,6点,12点,18点)对elearndata这个文件夹进行从A到B的增量更新,并将rsync的日志输出到/home/updateLog.txt这个文件里,‘>>’是追加输出的意思 3、保存即可,大功告成 经测试,可满足需求 (编辑:财气旺网 - 财气网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |