定时任务 cron:自动化第一步,备份从此不用想
VPS 玩到最后拼的是自动化:cron 定时任务五分钟入门,每天自动备份、自动更新,配置一次,剩下交给机器。跟着做就行,够用不折腾。
我是小够,只推够用的 VPS。
VPS 玩到最后,拼的不是配置,是自动化。每天手动备份数据库、手动清日志,坚持不了一个月就烦了。cron 是 Linux 自带的定时任务,配置一次,剩下的交给机器:每天凌晨自动备份、每周自动更新、日志自动清理。这篇五分钟入门,够用就行。
cron 是什么
cron 是 Linux 的"闹钟":你定好时间、写好要干的事,到点它自动执行。不用装,系统自带。每个用户有自己的任务表,用 crontab -e 编辑。
五个星号:时间的写法
打开 crontab -e,每行一个任务,格式是五个星号加命令:
* * * * * 要执行的命令
五个星号从左到右分别是:分 时 日 月 周。记住这个表,够用了:
* 每(每分钟/每小时/每天…)
*/5 每 5(每 5 分钟)
0 整点/整分
几个常用写法,直接抄:
0 3 * * * /root/backup.sh # 每天凌晨 3 点跑备份脚本
0 4 * * 0 /root/backup.sh # 每周日凌晨 4 点跑
*/10 * * * * /root/check.sh # 每 10 分钟跑一次
0 0 1 * * /root/monthly.sh # 每月 1 号凌晨跑
注意:周的 0 和 7 都代表周日,别写错。
三个新手常用任务
1. 每天自动备份网站数据
0 3 * * * tar -czf /root/backup/www-$(date +\%F).tar.gz /www/wwwroot >> /root/backup.log 2>&1
凌晨 3 点打包网站目录,文件名带日期。$(date +\%F) 在 crontab 里百分号要转义,照抄就行。
数据库别忘了:如果跑了 MySQL,加一行在备份网站之前:
0 2 * * * mysqldump -u root -p'你的密码' --all-databases | gzip > /root/backup/db-$(date +\%F).sql.gz
凌晨 2 点先备库,3 点再打包网站,顺序别反。密码里有特殊字符用单引号包起来,这是血泪教训。
2. 每天自动清理旧备份
0 4 * * * find /root/backup -name "*.tar.gz" -mtime +7 -delete
凌晨 4 点删掉 7 天前的备份,硬盘不会被备份撑爆。备份策略后面单开一篇细讲。
3. 每周自动更新系统安全补丁
0 5 * * 0 apt update && apt upgrade -y >> /root/update.log 2>&1
每周日凌晨 5 点更新。生产环境别这么干(更新可能要重启服务),个人博客和学习机可以,自动更新的详细配置看本站另一篇《服务器安全更新》。
日志和排错
cron 执行的结果不会显示在屏幕上,排错靠两招:
- 命令末尾加日志:
>> /root/cron.log 2>&1,正常输出和报错都写进日志,出问题先看它 - 看系统日志:
grep CRON /var/log/syslog,能看到每个任务什么时候跑了
新手最常见的三个坑:
- 路径问题:cron 的环境变量很少,命令写绝对路径,别写
python,写/usr/bin/python3。不确定路径用which python3查 - 百分号转义:命令里有
%必须写成\%,不然任务不执行还不报错,最气人的一种 - 没给执行权限:脚本
chmod +x别忘了,没权限 cron 会默默失败,日志里都不一定看得到 - 时区不对:VPS 默认可能是 UTC 时间,你写的"凌晨 3 点"按 UTC 跑,相当于北京时间 11 点。先
timedatectl看时区,不对就设成 Asia/Shanghai
小够提醒
- 定时任务先手动跑一遍,确认没问题再写进 crontab,别把没验证过的命令扔给凌晨 3 点
- 备份任务和清理任务配一对:只备份不清,硬盘早晚被撑爆
- 够用主义:cron 不用学全,五个星号加三个例子,能覆盖九成需求,剩下的现查现用