文档章节

Linux定时增量更新文件

MKZ1991
 MKZ1991
发布于 2014/01/17 18:37
字数 1684
阅读 3618
收藏 89

动机与需求:现在有两台服务器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、保存即可,大功告成


经测试,可满足需求

© 著作权归作者所有

MKZ1991
粉丝 1
博文 13
码字总数 5865
作品 0
南开
私信 提问
加载中

评论(4)

宏哥
宏哥
收藏了.
Feng_Yu
Feng_Yu

引用来自“ZMK”的评论

引用来自“Feng_Yu”的评论

信任密钥的操作可以简化为一条命令,ssh-copy-id root@remote_ip,自动帮你执行那些信任密钥的操作

受教了 居然有这个命令

那个是openssh-client带的一个脚本,是一个shell脚本,源码也很简单,就是ssh登录之后执行追加密钥到authorized_keys文件的操作。不过脚本中并没有提供端口的设置,如果ssh端口不是22的话这个脚本无法使用,可以自己修改这个脚本,加上端口选项。
MKZ1991
MKZ1991 博主

引用来自“Feng_Yu”的评论

信任密钥的操作可以简化为一条命令,ssh-copy-id root@remote_ip,自动帮你执行那些信任密钥的操作

受教了 居然有这个命令
Feng_Yu
Feng_Yu
信任密钥的操作可以简化为一条命令,ssh-copy-id root@remote_ip,自动帮你执行那些信任密钥的操作
清空weblogic日志文件nohup.out

通常使用linux服务器,我们都是需要在使用nohup模式不挂断地运行命令。最近发现服务器磁盘空间满了,查了半天发现原来nohup.out文件原来达到了1.5g,运行了一年1.5g的日志其实也不算打,可是...

彭苏云
2013/06/26
0
0
tar高级教程:增量备份、定时备份、网络备份

一、概述 备份与恢复对于系统维护而言是至关重要的事情。不合理的备份与还原会让你的数据面临丢失的风险。许多用户都在丢失重要数据后才意识到这种风险。而要从这种情况恢复数据将是非常耗时...

雁南飞丶
2015/10/28
0
0
solr的DIH操作同步mysql数据

1.创建MySQL数据 CREATE TABLE ( INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '城市编号', INT(10) UNSIGNED NOT NULL COMMENT '省份编号', VARCHAR(25) NULL DEFAULT NULL COMMENT ......

yushiwh
2017/09/28
0
0
Ubuntu如何备份和恢复系统

Ubuntu如何备份和恢复系统 在 使用Ubuntu之前,相信很多人都有过使用Windows系统的经历。如果你备份过Windows系统,那么你一定记忆犹新:首先需要找到一个备份工 具(通常都是私有软件),然后...

首席安全砖家
2013/03/10
0
3
MySQL数据备份之mysqldump使用

mysqldump常用于MySQL数据库逻辑备份。 1、各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文件(转储文件)...

文弱书生_罗剑
2015/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hadoop集群搭建-05安装配置YARN

Hadoop集群搭建-04安装配置HDFS Hadoop集群搭建-03编译安装hadoop Hadoop集群搭建-02安装配置Zookeeper Hadoop集群搭建-01前期准备 先保证集群5台虚拟机, nn1 nn2 s1 s2 s3 hadoop 是 是 是 ...

虚拟世界的懒猫
17分钟前
0
0
聊聊spring cloud的ConsulServiceRegistry

序 本文主要研究一下spring cloud的ConsulServiceRegistry ServiceRegistry spring-cloud-commons-2.1.2.RELEASE-sources.jar!/org/springframework/cloud/client/serviceregistry/ServiceR......

go4it
昨天
1
0
Nextjs 学习 —— hooks

22

lemos
昨天
1
0
如何在spring mvc restful接口中定制化类型转换和格式化

1.痛点 最近小胖哥搞了个小程序,有几个spring mvc 接口传递了时间,时间用java 8 time 相关的api 来直接接收: 当使用根据ISO 8601格式化的参数向任何这些方法发送POST请求时,报出了如下异...

码农小胖哥
昨天
13
0
docker日志监控

日志处理机制 我们先来了解一下docker日志处理的机制,当启动一个容器的时候,它其实是docker daemon的一个子进程,docker daemon可以拿到你容器里面进程的标准输出,拿到标准输出后,它会通...

爱宝贝丶
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部