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、保存即可,大功告成
经测试,可满足需求
Linux定时增量更新文件--转的更多相关文章
- linux定时删除过期文件
需求说明 每日凌晨0点定时删除/temp目录下的所有一个月未被访问的文件. 脚本实现 linux 终端输入crontab -e,添加定时任务脚本命令 [root@localhost ~]# cront ...
- django使用pyecharts(6)----django加入echarts_增量更新_定长_坐标轴定长
六.Django 前后端分离_定时增量更新图表(坐标轴定长) 1.安装 djangorestframework linux pip3 install djangorestframework windo ...
- django使用pyecharts(5)----django加入echarts_增量更新_定长
五.Django 前后端分离_定时增量更新图表定长数据 1.安装 djangorestframework linux pip3 install djangorestframework windows ...
- django使用pyecharts(4)----django加入echarts_增量更新
四.Django 前后端分离_定时增量更新图表 1.安装 djangorestframework linux pip3 install djangorestframework windows pip ...
- oracle或mysql定时增量更新索引数据到Elasticsearch
利用kettle Spoon从oracle或mysql定时增量更新数据到Elasticsearch https://blog.csdn.net/jin110502116/article/details ...
- 使用python备份数据库并删除备份超过一定时长的文件
#!/usr/bin/env python #-*- coding: utf-8 -*- """ @Project:Py @author:sandu @Email: sa ...
- Linux系统下定时上传文件至FTP服务器脚本
环境:Red Hat Enterprise Linux Server release 6.4 需求:需要将Oracle数据库的定时备份上传至FTP服务器 1.干货,用户名:oracle,数据库名称:X ...
- SSIS 实例 从Ftp获取多个文件并对数据库进行增量更新。
整个流程 Step 1 放置一个FTP Task 将远程文件复制到本地 建立FTP链接管理器后 Is LocalPatchVariable 设置为Ture 并创建一个变量设置本地路径 Operatio ...
- git实战-linux定时监控github更新状态(二)
系列文章 git介绍-常用操作(一)✓ git实战-linux定时监控github更新状态(二)✓ 本文主要内容 如何查看github的本地仓库和远程仓库的同步情况 linux服务器定时监控githu ...
随机推荐
- java web 中分布式 session 的实现
已经有现成的库现实现分布式的 session 管理: 1.memcached-session-manager. 2.tomcat-redis-session-manager. 3.spring-ses ...
- 「HNOI 2013」数列
题目链接 戳我 \(Solution\) 这道题貌似并不难的样子\(QAQ\) 我们发现这个因为有首项的关系所以有点不太好弄.所以我们要将这个首项对答案的影响给去掉. 我们可以构建一个差分数组,我们令 ...
- Mac与iPhone的使用
1.mac操作 苹果Mac操作系统下怎么显示隐藏文件(shift+cmmand+. ) Mac屏幕录制Gif Mac 键盘快捷键 Mac 上安装python3 2.iPhone操作 iPhone如何设 ...
- KVM虚拟环境安装
关闭防火墙 linux 半虚拟化是不能运行与安装KVM虚拟机的. #egrep '(vmx|svm)' --color=always /proc/cpuinfo yum -y install kvm ...
- “全栈2019”Java第七十二章:静态内部类访问外部类成员
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- [ActionSprit 3.0] FMS客户端与服务器端交互(传参)
客户端as: import flash.net.NetConnection; import flash.events.NetStatusEvent; var nc:NetConnection = ne ...
- codis__数据迁移和伸缩容
数据迁移命令 注意点:是迁移到某个 redis-group 而不是某个redis-servers 实例 伸缩容用法 redis 内存等不够用时 增容 : 增加redis-group, 然后迁移使用上 ...
- android开发如何获取res/raw和assets文件夹的路径
---恢复内容开始--- android开发如何获取res/raw和assets文件夹的路径,主要分为两种情况: 1.如果你只是拷贝动作,那么你只需要得到res/raw和assets文件输入流就可以, ...
- JAVA 多线程 杂谈
一:java创建线程的三种方式: 1.继承Thread类: 2.实现Runnable接口: 3.实现Callable接口:Callable接口重写的是 call() 方法.1-允许有返回值,2-允许抛 ...
- 条目二十一《总是让比较函数在等值情况下返回false》
条目二十一<总是让比较函数在等值情况下返回false> 这条目对序列容器是不适合的,因为序列容器就是通过等值判断来比较的. 对于关联容器来说,比较是等价比较,所以要注意等值的时候,比较子的 ...