centos利用crontab自动备份

最近在我们公司的云主机上用Hexo搭建了自己的博客,怕数据有丢失,所以希望能够对博客中的文章进行备份,防止发生意外时损失无法弥补。自己写了一个小的shell脚本用来进行备份,再查询如何定时自动备份时,遇到了crontab这么个东西,但是没想到这个过程还是遇到了很多坎坷,接下来就从两方面介绍一下我对自己的博客的文章是如何进行备份的。

第一步:备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
echo "start prepare bakcup"
#放置备份文件的位置
BACKUP_DIR=/mnt/***_backup
#需要备份的文件的位置
NEED_BACKUP_DIR=/root/dir
#备份文件的名称
BACKUP_NAME=***_$(date +"%Y%m%d")
#备份保留30天
DELETE_BACKUP_NAME=***_$(date -d -30day +"%Y%m%d").tar.gz
#删除本地30天前的数据
echo "delete 30 days ago"
rm -rf $BACKUP_DIR/$DELETE_BACKUP_NAME
#开始备份,备份到放置备份文件的文件夹
echo "start bakcup"
tar -zcv -f $BACKUP_DIR/$BACKUP_NAME.tar.gz $NEED_BACKUP_DIR/
echo "end bakcup"

脚本中分为两部分,首先需要删除30天之前的脚本(默认只保留30天之内的),最后,对目标文件(需要备份的文件)进行解压,并且指定到存储备份的指定位置。

第二步:定时执行脚本

首先需要介绍一下crond,crond是Linux下用来周期性的执行某个任务或等待处理某些事件的一个守护继承,与windows下的计划任务类似。安装完操作系统(UNIX内核)后会默认安装此服务,且服务是启动的。

众所周知,Linux下的任务调度分为两种:系统任务调度和用户任务调度。

系统任务调度:系统需要周期性执行的工作,其配置文件为/etc/crontab,打开后内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

其中前四行主要是配置自动任务执行时的一些环境变量,这个非常重要。下边还给出了一个示例,可以明显看出前五位用于定义任务何时执行,但是不同于我们使用的cron表示式,它只能够精确到分,其次是指定执行的用户,最后才是需要执行的命令。

用户任务调度:用户定期要执行的工作。配置文件保存在/var/spool/cron/,文件名就是用户名。

我们需要使用的就是用户级的任务调度就可以,首先需要介绍有关crontab的命令。

介绍命令之前需要确认是否安装了crontab,如果没有需要安装,安装命令yum install crontab,安装成功之后需要手动启动crond服务,/sbin/service crond start,查看是否启动成功,service crond status,同时还可以设置为开启启动,chkconfig –level 35 crond on

crontab [-u user] [ -e | -l | -r ]

主要说几个常用的:

-e:编辑某个用户的crontab文件内容,如果不指定的用户,默认为当前用户;

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容

使用crontab -e创建一个自动任务,具体内容如下:

1
* * * * * /root/auto_bakcup_l-zz.sh

首先验证定时任务是否生效,结果发现并没有执行备份的脚本,猜测有可能是备份脚本中没有配置环境变量,所以导致系统执行任务调度时就存在问题。为了验证是否是环境变量引起的问题,修改了备份脚本,修改后内容如下:

1
2
3
#!/bin/bash
echo $PATH #打印环境变量

然后自动任务,将备份脚本的echo追加到指定的日志文件:

1
* * * * * /root/auto_bakcup_l-zz.sh >> /tmp/auto_bakcup.log 2>&1

然后对自动任务进行重启/etc/init.d/crond restart,查看日志文件,发现打印的环境变量为:

1
/usr/bin:/bin

与我们在终端下执行echo $PATH输出的环境变量为:

1
/root/.nvm/v6.10.0/bin:/root/jdk1.7.0_79/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

却有不同,所以有此判断是由于环境变量的原因引起的。

解决办法:在备份脚本的头部需要添加一行代码,source /etc/profile,手动去加载配置文件。

到此自动备份就OK了!


参考文章:crontab命令crontab定时任务不执行

推荐文章