定时任务 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 执行的结果不会显示在屏幕上,排错靠两招:

  1. 命令末尾加日志:>> /root/cron.log 2>&1,正常输出和报错都写进日志,出问题先看它
  2. 看系统日志: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 不用学全,五个星号加三个例子,能覆盖九成需求,剩下的现查现用