centos使用lftp备份文件
一直以来项目的文件没有备份,最近需要增加备份,本来以为备份是IT的工作,结果IT说工作忙,拖了半个月给分配完ftp服务器后说不给备份,需要我们开发自己备份。。。我特么***
对于ftp备份,咱是没有经验的,IT给提示了一个工具:lftp。
关于lftp的介绍可以看这篇文章:https://blog.csdn.net/weixin_43135696/article/details/121541807,其中lftp -c命令我没搞懂到底要怎么执行,-c后面的cmd命令总提示不存在。
而备份文件主要用的是lftp mirror命令,参考:https://blog.51cto.com/riverxyz/1869476,总结如下:
- mirror [OPTS] [source [target]]
- [opts]参数如下:
-c, --continue 续传上次的任务- -e, --delete 删除远程目录上不存在的文件(删的是本地啊注意)
- --delete-first 在传输新文件之前删除旧的文件
- --depth-first 进入下一层目录优先于文件传输
- -s, --allow-suid 根据远程站点设置suid/sgid比特位
- --allow-chown 尝试将自己设置为文件所有者和所有组
- --ascii 使用ascii方式传输(隐含了--ignore-size)
- --ignore-time 决定是否下载时忽略时间因素
- --ignore-size 决定是否下载时忽略文件大小因素
- --only-missing 只下载缺少的文件
- --only-existing 只下载已经存在于目标文件夹中的文件
- -n, --only-newer 只下载新文件(-c参数无法工作)
- --no-empty-dirs 不创建空文件夹(隐含了--depth-first)
- -r, --no-recursion 不进入子文件夹
- --no-symlinks 不创建符号链接
- -p, --no-perms 不设置文件权限
- --no-umask 不使用文件预设权限
- -R, --reverse 反向镜像(上传文件,注意大写)
- -L, --dereference 将符号链接作为 文件下载
- -N, --newer-than=SPEC 只下载比指定时间晚的文件
- --on-change=CMD 只要有文件或文件夹存在差异就执行命令CMD
- --older-than=SPEC 只下载比指定时间早的文件
- --size-range=RANGE 只下载大小在指定区间上的文件
- -P, --parallel[=N] 并行下载N个文件
- --use-pget[-n=N] 使用pget传输每个文件
- --loop 循环直到找不到差异
- -i RX, --include RX 包括相匹配的文件
- -x RX, --exclude RX 不包括相匹配的文件
- -I GP, --include-glob GP 包括相匹配的文件
- -X GP, --exclude-glob GP 不包括相匹配的文件
- -v, --verbose[=level] 输出等级,加该参数输出执行详情,不加则在底部变动显示。
- --log=FILE 将执行的lftp命令写入文件FILE
- --script=FILE 将lftp命令写入文件FILE,但不执行
- --just-print, --dry-run 与--script=-相同
- --use-cache 使用缓存目录列表
我的想法是每天定时将本地文件夹备份到远程ftp服务器上,所以执行
- lftp -e "mirror --reverse --only-missing --only-newer 本地文件夹 ftp文件夹 --parallel=5 --log=日志.log" 账号:密码@ftp服务器ip
- 或
- lftp -u 账号,密码 -e "mirror --reverse --only-missing --only-newer --verbose 本地文件夹 ftp文件夹 --parallel=3 --log=日志.log" ftp服务器ip
以上两个方式效果是一样的。其中参数 --verbose可以在控制台输出执行详情,不想输出的可以不加,执行完成最终会显示本次执行上传了多少文件和创建了多少文件夹。
现实远非单个文件夹,由于早期设计原因,各个模块的文件夹是存在不同的目录下的,而且命名方式“各显神通”,有的以模块为根目录,有的以年月为根目录,有的模块只有根目录一级目录(所有的文件都在一级目录下),有的模块次级目录是年月而有的次级目录是年月日...
针对已经存在的目录尽量不进行大的变动了,但对于文件量大的模块还是不得不进行改造,比如上面说的只有模块一级目录的文件夹如果每日增量文件不小则需要添加年月(甚至年月日)次级目录。历史的目录只需按上面的命令执行全量备份即可,对于每日的增量文件进行定时任务的增量备份。
按以上几种情况整合bat脚本如下:


- #!/bin/bash
- # 每小时执行一次同步文件到ftp服务器,要考虑跨天情况
- # 设置今天对应的年月(yyyy-mm)、日期(dd)、时间(yyyy-mm-dd HH:MM:SS,注意中间空格的方式)
- date_ym=`date +%Y-%m`
- date_d=`date +%d`
- date_ymd=`date +%Y-%m-%d" "%H:%M:%S`
- # 半年前日期
- halfyear_ymd=`date -d "-179 day" +%Y-%m-%d`
- # 半年前对应日期再往前一小时所属日期,只能按小时数(24*179+1)
- halfyear_last_hour_ymd=`date -d "-4297 hour" +%Y-%m-%d`
- # 当前时间往前一小时所属年月日
- last_hour_ymd=`date -d "-1 hour" +%Y-%m-%d`
- last_hour_ym=`date -d "-1 hour" +%Y-%m`
- last_hour_d=`date -d "-1 hour" +%d`
- last_hour_h=`date -d "-1 hour" +%H`
- echo $date_ymd"开始同步------------------"
- echo $last_hour_d
- echo $last_hour_ym
- echo $last_hour_ymd
- echo $last_hour_h
- echo $halfyear_ymd
- echo $halfyear_last_hour_ymd
- # 将执行日志保存进脚本目录下属日志文件夹/年月日文件夹,先创建文件夹,否则报错不存在目录
- mkdir -p /本地脚本目录/logs/$last_hour_ym/$last_hour_d/
- # 同步一小时前所在月份文件夹,比如文件夹2022-10
- if [ -d "/本地目录/"$last_hour_ym ]; then
- echo $last_hour_ym
- lftp -u 账号,密码 ftp服务器ip << EOF
- mirror --reverse --only-missing --only-newer /本地目录/$last_hour_ym ftp服务器目录/$last_hour_ym --parallel=3 --log=/本地脚本目录/logs/$last_hour_ym/$last_hour_d/$last_hour_d-$last_hour_h.log
- bye
- EOF
- else
- echo $last_hour_ym"不存在"
- fi
- # 同步具体分类文件夹,不带年月子文件夹
- for item in 模块1目录 模块2目录 模块N目录
- do
- echo $item;
- lftp -u 账号,密码 ftp服务器ip << EOF
- mirror --reverse --only-missing --only-newer /本地目录/$item ftp服务器目录/$item --parallel=3 --log=/本地脚本目录/logs/$last_hour_ym/$last_hour_d/$item-$last_hour_h.log
- bye
- EOF
- done
- # 同步具体分类文件夹,带年月(模块名/2022-10)子文件夹
- for item in 模块11目录 模块22目录 模块NN目录
- do
- if [ -d "/本地目录/"$item"/"$last_hour_ym ]; then
- echo $item;
- lftp -u 账号,密码 ftp服务器ip << EOF
- mirror --reverse --only-missing --only-newer /本地目录/$item/$last_hour_ym ftp服务器目录/$item/$last_hour_ym --parallel=3 --log=/本地脚本目录/logs/$last_hour_ym/$last_hour_d/$item-$last_hour_h.log
- bye
- EOF
- else
- echo $item"/"$last_hour_ym"不存在"
- fi
- done
- # 同步具体分类文件夹,带年月日(模块名/2022-10-29)子文件夹的
- for item in 模块111目录 模块222目录 模块NNN目录
- do
- if [ -d "/本地目录/"$item"/"$last_hour_ymd ]; then
- echo $item;
- lftp -u 账号,密码 ftp服务器ip << EOF
- mirror --reverse --only-missing --only-newer /本地目录/$item/$last_hour_ymd ftp服务器目录/$item/$last_hour_ymd --parallel=3 --log=/本地脚本目录/logs/$last_hour_ym/$last_hour_d/$item-$last_hour_h.log
- bye
- EOF
- else
- echo $item"/"$last_hour_ymd"不存在"
- fi
- done
- echo '同步结束----------------------'
定时执行备份的脚本
以上脚本涉及诸多知识,对于不熟悉linux(shell、bat)命令的人来说会踩很多坑,下面备注下:
1、如何写一个linux脚本,可参考:https://blog.csdn.net/scdncby/article/details/112339627,其中首要备注#!/bin/bash,很多时候没有这个声明会报错。
2、定时备份那么就要涉及到日期或者时间值,尤其是对于0点跨天时,凌晨23点以后新上传的文件,在第二天凌晨0点后如果只是按日期备份,那么23点的文件就容易漏掉,所以要按当前时间的前一小时所属的日期执行判断。这里就需要用到linux的日期取值函数。第一个搜到的参考文章是:https://blog.51cto.com/sadlar/1332921,然后自己摸索,到拼接年月日+时间的时候遇到一点障碍,不过还是解决了~~,关于linux字符串拼接可以参考文章:https://blog.csdn.net/sodalife/article/details/110673401。最终得出以下取值:
- # 设置今天对应的年月(yyyy-mm)、日期(dd)、时间(yyyy-mm-dd HH:MM:SS,注意中间空格的方式)
- date_ym=`date +%Y-%m`
- date_d=`date +%d`
- date_ymd=`date +%Y-%m-%d" "%H:%M:%S`
- # 半年前日期
- halfyear_ymd=`date -d "-179 day" +%Y-%m-%d`
- # 半年前对应日期再往前一小时所属日期,只能按小时数(24*179+1)
- halfyear_last_hour_ymd=`date -d "-4297 hour" +%Y-%m-%d`
- # 当前时间往前一小时所属年月日
- last_hour_ymd=`date -d "-1 hour" +%Y-%m-%d`
- last_hour_ym=`date -d "-1 hour" +%Y-%m`
- last_hour_d=`date -d "-1 hour" +%d`
- last_hour_h=`date -d "-1 hour" +%H`
3、判断文件夹是否存在。linux中判断用的也是if语句,但是又有不同,比如在centos中判断条件是用中括号括起来的,而且必须与if关键字之间和条件之间有空格(if [ 条件 ]; ),我之前就吃过这个空格的亏。。可以参考文章:https://blog.csdn.net/hhd1988/article/details/113552656 和https://blog.csdn.net/qq_45484237/article/details/124023066。 判断文件夹目录用的是-d指令,然后目录地址可以是拼接起来的,甚至是拼接变量名,这就很强大。比如:
- last_hour_ym=`date -d "-1 hour" +%Y-%m`
- if [ -d "/本地目录/"$last_hour_ym ]; then
- echo $last_hour_ym
- else
- echo $last_hour_ym"不存在"
- fi
4、关于for循环,可以参考文章:https://www.cnblogs.com/shigongp/p/16686336.html,for循环既可以循环文件夹目录,也可以循环罗列的字符串(多个字符串直接用空格隔开),本文用的是字符串罗列的,更多场景应该是循环文件夹目录吧。
5、关于命令块<<,有些时候,linux命令会进入新的控制端,比如ssh,ftp等,进入新控制端执行需要的命令,这时有两种方式,一种是直接将所有的命令用&拼接起来,一种就是使用命令块符号<<。关于具体使用本文不做详解,直接举例,以最上面lftp的命令为例,执行命令
- lftp -e "mirror --reverse --only-missing --only-newer 本地文件夹 ftp文件夹 --parallel=5 --log=日志.log" 账号:密码@ftp服务器ip
后会进入lftp控制端,后面的所有命令都是在lftp控制端里,只有手动执行bye命令才会退出回到主服务器控制端。但在脚本里直接写两行命令肯定是不行的,需要用写在命令块里,写作:
- lftp -u 账号,密码 ftp服务器ip << EOF
- mirror --reverse --only-missing --only-newer /本地目录/$last_hour_ym ftp服务器目录/$last_hour_ym --parallel=3 --log=/本地脚本目录/logs/$last_hour_ym/$last_hour_d/$last_hour_d-$last_hour_h.log
- bye
- EOF
命令解读为:先登录ftp服务器,然后执行备份操作,然后bye退出。这里有个要注意的点,EOF块所属的代码必须顶格写,不然会报错:warning: here-document at line 5 delimited by end-of-file (wanted `EOF`,可以参考文章:https://blog.csdn.net/weixin_42575593/article/details/83686244
设计完了脚本,就考虑怎么设为定时任务了。
centos中设置定时任务用的是crontabs,可以参考文章:https://blog.csdn.net/m0_48096446/article/details/122378767 ,查了下我的服务器已经安装了,所以直接修改/etc/crontab配置(50 0,9-22 * * * root /bak/bak_files.sh)执行时间,后来发现执行crontab /etc/crontab后覆盖了原有的定时任务,问了IT说原来的是物理机和服务器之间同步时间的,md,还得让他们搞回来。。。
至此,定时备份配置完成。
centos使用lftp备份文件的更多相关文章
- fltp备份文件后统计验证
上一篇(https://www.cnblogs.com/jying/p/16805821.html)记录了自己在centos使用lftp备份文件的过程,本篇记录自己对备份后的文件与源文件目录的对比统计 ...
- CentOS7更换国内源
前言 CentOS 有个很方便的软件安装工具yum,但是默认安装完CentOS,系统里使用的是国外的CentOS更新源,这就造成了我们使用默认更新源安装或者更新软件时速度很慢的问题,甚至更新失败. 为 ...
- CentOS安装crontab 定时备份文件夹
一. 编写脚本编写一个脚本文件,使脚本可以执行备份命令. 例如,将文件目录 /home/backups/balalala 备份到/home目录下,并压缩.1. 创建脚本命令格式: touch 路径/文 ...
- 【Linux】【CentOS】【FTP】FTP服务器安装与配置(vsftpd、lftp)
[初次学习.配置的笔记,如有不当,欢迎在评论区纠正 -- 萌狼蓝天 @ 2021-12-02] 基本概念 FTP访问方式 实体账号:本地账户 来宾账户:guest 匿名登录:anonymous fp ...
- [CentOS] rsync同步目录进行备份文件
操作不难,网上一堆.这里列几个 CentOS7 参考地址: https://www.server-world.info/en/note?os=CentOS_7&p=rsync Copy fil ...
- CentOS 7 虚拟机无法开机问题
若虚拟机在不正常关机的时候会遇到如下图所示的问题:先点击"取消"按钮
- centos 7.0 nginx 1.7.9成功安装过程
centos 7.0根目录 的目录构成 [root@localhost /]# lsbin dev home lib64 mnt proc run srv tmp varboot etc lib me ...
- 在CentOS下自动备份mysql
在CentOS下自动备份mysql数据库,并差异同步到其它网络主机上 1.在/root/mysql_backup/下添加backup.sh:vim /root/mysql_backup/backup. ...
- Docker 学习笔记(CentOS 7.1)
基本概念 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository)理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 D ...
随机推荐
- 检查原生 JavaScript 函数是否被覆盖
你如何确定一个JavaScript原生函数是否被覆盖? 你不能--或者至少无法可靠地确定.有一些检测方法很接近,但你不能完全相信它们. JavaScript原生函数 在JavaScript中,原生函数 ...
- 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)
学习ASP.NET Core Blazor编程系列一--综述 一.概述 Blazor 是一个生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...
- KingbaseES R3 读写分离集群在线扩容案例
案例说明: 1. 通过sys_basebackup创建新备库. 2. 将备库加入到Cluster nodes管理,可以用kingbase_monitor.sh一键启停. 3. 主备复制切换测试. 此次 ...
- TFT-eSPI入门使用教程
一.准备资料 开发板:ESP32-S3 屏驱动是:ST7789_DRIVER 开发环境:VS Code + PlatformIO 注意:以上是我使用的环境,不一定需要和是使用的东西一样,这里主要是学习 ...
- 基于koa模块和socket.io模块搭建的node服务器实现通过jwt 验证来渲染列表、私聊、群聊功能
1. 具体代码在需要的下载 https://gitee.com/zyqwasd/socket 效果: 2. package.json文件 1. 下载基本的模块 修改了start 脚本 nodemo ...
- Java 加载、编辑和保存WPS表格文件(.et/.ett)
WPS表格文件是金山开发的专门用于处理表格数据的Office工具,属于WPS Office中WPS文字.WPS表格和WPS演示三大功能模块之一.通常以.et和.ett作为文件后缀.我们在通过后端来操作 ...
- 【COS生态建设】开发者有奖调研,等你来参与!
为了更好的赋能开发者,为大家提供更好的开源应用,我们诚挚的邀请您抽出几分钟参与"有奖问卷",告诉我们您对"COS生态建设"的意见和建议.希望通过这份调查问卷,能 ...
- Prometheus 监控外部 Kubernetes 集群
转载自:https://www.qikqiak.com/post/monitor-external-k8s-on-prometheus/ 在实际环境中很多企业是将 Prometheus 单独部署在集群 ...
- 胎压监测系统(DWS)
胎压监测系统(DWS)通过监测和比较行驶时各车轮和轮胎的滚动半径和旋转特性,以确定是否一个或多个轮胎明显充气不足,而非直接测量各轮胎的压力. 系统监测到异常时指示灯将点亮,且仪表上出现信息. 必须校准 ...
- 使用 Skywalking Agent,这里使用sidecar 模式挂载 agent
文章转载自:https://bbs.huaweicloud.com/blogs/315037 方法汇总 Java 中使用 agent ,提供了以下三种方式供你选择 使用官方提供的基础镜像 将 agen ...