centos使用lftp备份文件( 二 )

定时执行备份的脚本
以上脚本涉及诸多知识,对于不熟悉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 ]; thenecho $last_hour_ymelseecho $last_hour_ym"不存在"fi4、关于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 << EOFmirror --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.logbyeEOF命令解读为:先登录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备份文件】

推荐阅读