Linux使用shell脚本定时备份文件(夹)

友情提醒:本文最后更新于 1665 天前,文中所描述的信息可能已发生改变,请谨慎使用。

备份的原理

使用Linux的Cron程序定时执行该脚本从而达到备份和删除备份历史的目的。

主要参数

脚本主要需要设置参数有三个:

  • ORIGIN_FOLDER:要备份的目录,必须以\结尾
  • DES_FOLDER:备份文件存储路径(可以是网络路径,前提是必须要有权限管理该路径下的文件夹)
  • DAYS_AGO:该参数表示要删除多少天之前的备份(比如今天是2012年12月31日,那么20121221的文件不会被删除,20121220或比之小的文件夹将会被删除)

脚本

#! /bin/sh
#---------------------------------------------------------------------
#   shell自动备份文件夹同时检查一定日期前的文件夹并删除
#   部署好本脚本后应当在linux中设置cron自动执行:
#   1、在linux的/etc/cron.d/目录下新建空文件
#   2、使用"crontab -e"编辑新的定时任务并保存
#   3、chkconfig crond on
#   (注意:在cron模式下文件操作必须使用绝对路径)
#                                                       --by: Blademainer
#---------------------------------------------------------------------
# 设置要备份的目录,多个文件夹以逗号分隔
ORIGIN_FOLDER=test,testlog
# 设置备份文件的存储目录,可以是绝对路径
DES_FOLDER=bak
# 设置删除多少天之前的备份
DAYS_AGO=10


# 定义日期变量,时间戳的单位以秒为单位
SECOND=1
MINUTE=$((60*$SECOND))
HOUR=$((60*$MINUTE))
DAY=$((24*$HOUR))
WEEK=$((7*$DAY))

# 当前日期的字符串表达形式
NOW=$(date +'%Y-%m-%d_%H%M%S')

# 计算当前时间的时间戳表达方法
TIME_NOW=$(($(date +%s -d "$(date +'%Y-%m-%d %H:%M:%S')")))

SECONDS_OF_DAYS_AGO=$(($DAYS_AGO * $DAY))
# 计算指定天数前的时间戳表达方法
TIME_AGO=$(($TIME_NOW - $SECONDS_OF_DAYS_AGO))

# 判断传入的日期是否在设置的日期之前
function isDaysBefore()
{
  DATE=$(($(date +%s -d $1)))
  if [[ $DATE < $TIME_AGO ]] 
  then
    echo 1
  else
    echo 0
  fi
}

# 检验文件夹
if [ ! -d "$DES_FOLDER" ]; then  
  echo `mkdir $DES_FOLDER`
fi

DES_PATH=$DES_FOLDER/$NOW/
if [ ! -d "$DES_PATH" ]; then  
  echo `mkdir $DES_PATH`
fi

if [ ! -f "$DES_FOLDER/$NOW/$NOW.log" ]; then  
  echo `touch $DES_FOLDER/$NOW/$NOW.log`
fi

# 拷贝文件夹
var=`echo "$ORIGIN_FOLDER"|awk -F ',' '{print $0}' | sed "s/,/ /g"`
for VAR_ORIGIN_FOLDER in $var; do
  command=`cp -rf $VAR_ORIGIN_FOLDER $DES_PATH`
done


# 删除备份文件夹
for FOLDER in `ls $DES_FOLDER`; do
  #截取年月日
  folder_date=`expr substr $FOLDER 1 10`
  if [[ $(isDaysBefore $folder_date) == 1 ]]
  then
    echo `rm -fr $DES_FOLDER/$FOLDER`
  fi
done

要记得赋予权限,如果不给予权限的话,该脚本是无法运行的

chmod 777 backup.sh

编辑定时任务

执行以下命令:

crontab  -e

按i键进入编辑状态,我现在的时间是17点20分,这里我们设置一下每天17点25分的定时任务,复制粘贴一下代码:

25 17 * * * ~/backup.sh

保存并退出,时间的设置可以参考下面Crontab 格式,很容易理解的,第一个数字25为分钟,第二个数字17为小时。

Crontab 格式

分 时 日 月 周 执行命令
第 1 列分钟 1~59,每分钟用 * 或者*/1表示,整点分钟数为00或0
第 2 列小时 1~23(0 表示 0 点)
第 3 列日 1~31
第 4 列月 1~12
第 5 列星期 0~6(0 表示星期天)
第 6 列要运行的命令
0 3 * * * /root/mysql_bak/backup.sh,此命令表示在每天的凌晨三点执行一次脚本,可自行调整时间

重启crondtab服务

编写好定时任务后,需要重启crondtab服务,命令如下:

service crond restart

接下来就等时间到了后,查看备份目录是否生成了备份文件。

查看crontab状态

当然我们也可以通过查看crontab的状态来知道backup.sh脚本是否被执行,

tail -f /var/log/cron


相关链接:
https://www.jianshu.com/p/6fa3d67845aa
https://xiongyingqi.com/2014/01/03/2014-01-04-linux-backup-shell/

上一篇:缓存穿透,缓存击穿,缓存雪崩释义以及解决方案

下一篇:八大排序算法的Python实现