over 8 years ago
最近在搭建服务器时需要每天对数据库里的内容进行备份,所以简单学习了下crontab这个命令的使用方式。
目标
- 每天凌晨1点对数据库进行备份
- 每次备份后将数据库文件加上时间戳并存储到指定文件夹
- 备份完成后在log里写入当前时间和备份文件名
先写一个bash脚本
#! /bin/bash
cur_time=$(date +%Y_%m_%d_%k_%M_%S) #获取当前时间,并按照 年_月_日_小时_分钟_秒 的格式存储
file_name=./db_backup/db.sqlite3.bak_$cur_time #将刚获取的时间接在备份文件名的后面
sqlite3 db.sqlite3 .dump > $file_name #对一个sqlite数据库进行备份
now=$(date +'%x %X') #获取现在的时间
output=$(printf "[ %s ] db backed @ %s" "$now" "$file_name") #写一行log
echo $output >> ~/logs/cron.log #将log写入指定文件
将上述文件保存为一个脚本,比如backup.sh
再来添加定时重复的工作
在Linux下使用crontab这个命令可以做到:
- crontab -e | 编辑你的定时工作脚本
- crontab -l | 查看你的工作脚本
- crontab -r | 删除你的工作脚本
- crontab -l > 文件名 | 将你的脚本备份到一个文件里
- crontab 文件名 | 将指定文件的内容复制到你的工作脚本
编辑定时工作脚本
首先通过下面的命令来创建一个脚本,如果你有设置系统默认的文本编辑器的话,则该文件会在默认的编辑器下打开
crontab -e
如果输入完上述命令后你得到的结果是:
no crontab for root - using an empty one
888
则说明你还没有设置默认的文本编辑器,可以通过下面的命令来设置:
export EDITOR=nano
上面例子中使用了nano,但你可以随意替换成pico、vi等任意编辑器。设置好后,再次执行crontab -e
我希望每天凌晨一点自动备份一下数据库,那么我会在crontab的文件里这么写:
0 1 * * * /home/cheng/backup.sh
第一个0代表0分,1代表1点,后面的三个*分别代表日,月,周日。最后的文件路径是你需要执行的脚本。
前五个数值的范围分别为:
- 分 0 - 59
- 小时 0 - 23
- 日 1 - 31
- 月 1 - 12
- 周日 sun, mon, tue, wed, thu, fri, sat (可以用这些缩写表示一周中的那一天,也可以用数字 0 - 7 表示, 注意0和7都是周日的意思)
下面是一些简单的示例:
每周日下午五点执行一次:
0 17 * * sun /scripts/script.sh
每6小时执行一次:
0 */6 * * * /scripts/script.sh
每分钟执行一次:
* * * * * /scripts/script.sh
找到一个很好的参考网站: http://tecadmin.net/crontab-in-linux-with-20-examples-of-cron-schedule/
Crontab文件的存储位置
每个用户通过crontab -e创建的脚本文件会被存储在:
cd /var/spool/cron/crontabs/
这个文件夹下每个用户的脚本文件会以该用户的用户名进行区分存储。
Reference:
http://www.ibm.com/developerworks/library/l-job-scheduling/