crond 基本用法
使用 crond
可以定时执行指定任务,基本用法如下:
-e
编辑定时任务-r
终止任务调度-l
列出当前有哪些任务调度
重启任务调度:systemctl restart crond.service
可在定时任务中调用 shell 脚本,需要注意的是,在执行前需要确保用户对指定的 shell 脚本有可执行权限
基本需求
我的博客都写到了 mysql 数据库中,为了方便日后更换主机恢复数据,我需要每天凌晨 4:00 对博客数据库进行备份,备份规则为:
- 备份到
data/backup/db
目录下 - 备份文件以日期为名称,打包为
tar.gz
文件 - 如发现有 10 天前的备份文件,则删除
有了基本需求,就可以编写 shell 脚本了
脚本编写
先准备好需要的自定义变量:
- 备份目录
- 当前时间
- 数据库相关配置
#备份目录
BACKUP=/data/backup/db
#获取当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库地址
HOST=localhost
#数据库用户名及密码
DB_USER=root
DB_PW=xxxxxxxx
#备份的数据库名
DATEBASE=myblog
指定备份目录,如果不存在就创建
#判断文件存在且是一个目录,不存在就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
打包成 tar.gz
,并删除对应的备份目录
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
rm -rf ${BACKUP}/${DATETIME}
查找是否存在 10 天前的备份文件,存在就删除
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "finish backup ${DATABASE}"
完整脚本:
#!/bin/bash
#备份目录
BACKUP=/data/backup/db
#获取当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
#数据库地址
HOST=localhost
#数据库用户名及密码
DB_USER=root
DB_PW=xxxxxxxx
#备份的数据库名
DATEBASE=myblog
#备份目录,如果不存在就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
#备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --databases ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
#打包成tar.gz,并删除对应的备份目录
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
rm -rf ${BACKUP}/${DATETIME}
#删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "finish backup ${DATABASE}"
为脚本增加可执行权限:
chmod u+x /usr/sbin/mysql_db_backup.sh
使用 crond 定时执行脚本
启动 crond 并定时调用脚本
crontab -e
0 4 * * * /usr/sbin/mysql_db_backup.sh
简单介绍一下 crond
中 5 个占位符 * * * * *
的含义:
- 第一个
*
,一小时中的第几分钟,范围 [0, 59] - 第二个
*
,一天中的第几个小时,范围 [0, 23] - 第三个
*
,一个月中的第几天,范围 [1, 31] - 第四个
*
,一年中的第几个月,范围 [1, 12 ] - 第五个
*
,一周当中的星期几,范围 [0, 7],0 和 7 都表示周日
因此每日凌晨四点半为 0 4 * * *
查看任务是否执行
crontab -l
如果输出为 0 4 * * * /usr/sbin/mysql_db_backup.sh
,则表示定时任务已经启动。