很多站长把网站部署上线之后,服务器上的日常维护全靠“想起来才做”:日志堆满了才去清、备份全靠手动点、证书过期了才发现网站打不开。其实 Linux 内置的 Crontab 定时任务工具,就能让服务器按预定时间自动执行命令,把日志清理、数据备份、证书续期这些重复劳动全部交给机器。本文按真实操作顺序,把 Crontab 从基础语法到实战应用一次讲清,照着配置就能把服务器真正“自动化”起来。
一、Crontab 基础:先看懂时间表达式
Crontab 的每个任务由“时间表达式 + 命令”两部分组成,时间表达式一共五个字段,从左到右依次表示:分钟、小时、日、月、星期。
- * 表示任意值,比如 * * * * * 表示每分钟执行一次
- 逗号表示多个取值,比如 1,15 表示第 1 分钟和第 15 分钟
- 连字符表示范围,比如 9-17 表示 9 点到 17 点
- 斜杠表示间隔,比如 */10 表示每 10 分钟执行一次
下面几行是日常最常用的写法,直接抄进 crontab 就能用:
*/5 * * * * # 每 5 分钟执行一次
0 3 * * * # 每天凌晨 3 点执行
30 2 * * 1 # 每周一凌晨 2 点 30 分执行
0 0 1 * * # 每月 1 号凌晨 0 点执行
编辑定时任务用 crontab -e,查看已生效的任务用 crontab -l,清空全部任务用 crontab -r。任务保存后立即生效,不需要重启任何服务。
二、第一个定时任务:日志自动清理
服务器跑久了,Nginx、PHP 和系统日志会越积越多,磁盘很快就会被塞满。第一个定时任务,就从一个每天自动清理日志的命令开始:
0 4 * * * find /www/wwwlogs -name "*.log" -mtime +7 -delete
拆开看:0 4 * * * 表示每天凌晨 4 点执行,find 命令会把 7 天前(-mtime +7)的 .log 文件找出来并删除。把这一行加进 crontab -e 保存,日志清理从此再也不用手动管。
三、数据库自动备份:给数据上双保险
手动备份靠不住,让服务器自己每天备份才是正解。先写一个备份脚本 /opt/backup.sh,内容如下:
#!/bin/bash
mysqldump -uroot -p"你的数据库密码" myblog > /www/backup/myblog_$(date +%Y%m%d).sql
tar czf /www/backup/myblog_$(date +%Y%m%d).tar.gz -C /www/wwwroot/myblog .
find /www/backup -name "*.sql" -mtime +7 -delete
然后赋予执行权限,再把脚本交给 Crontab,每天凌晨 3 点自动执行:
chmod +x /opt/backup.sh
0 3 * * * /opt/backup.sh
这样数据库和网站文件会被打包成带日期的压缩包,同时自动清理 7 天前的旧备份,既不怕丢数据,也不会把磁盘撑爆。
四、证书自动续期:HTTPS 不再掉链子
Let's Encrypt 免费证书的有效期只有 90 天,靠手动续期很容易忘记,一旦过期,浏览器会直接提示“不安全”。用 Certbot 配置好自动续期后,再加一条定时任务,就一劳永逸了:
0 2 * * 1 certbot renew --quiet --renew-hook "systemctl reload nginx"
建议先用 certbot renew --dry-run 试跑一次,确认续期流程没有报错,再交给定时任务定期执行,避免续期失败而不自知。
五、任务日志与常见坑:别再“静默失败”
Crontab 默认不保存任务输出,命令报错也看不到,出了问题很难排查。建议把定时任务的输出重定向到日志文件:
0 4 * * * /opt/backup.sh >> /var/log/backup.log 2>&1
另外还有几个常见的坑,遇到“任务没生效”时按顺序排查:
- 环境变量:Cron 的执行环境很干净,命令一定要写绝对路径,比如 /usr/bin/mysqldump,而不是裸的 mysqldump
- 执行权限:脚本要记得 chmod +x,路径也要写对,否则任务会静默失败
- 时区问题:服务器默认可能是 UTC,比北京时间慢 8 小时,先执行 timedatectl set-timezone Asia/Shanghai
- 排查日志:任务没执行时,看 /var/log/syslog 或 journalctl -u cron 的输出
六、宝塔面板定时任务:图形化替代方案
不想记命令行也没关系,宝塔面板自带“计划任务”功能,支持 Shell 脚本、备份网站、备份数据库等任务类型,在界面上选好执行周期、填好脚本点保存即可,底层同样是 Crontab,效果完全一致,特别适合不熟悉命令行的站长。
最后再叮嘱一句:定时任务上线前,一定要先手动把脚本跑一遍,确认命令本身没有问题,再交给 Crontab 定期执行,避免“任务在跑、活没干完”的静默失败。
上线前检查清单
- 脚本已手动执行过,输出正常
- 任务输出已重定向到日志文件
- 服务器时区已设置为 Asia/Shanghai
- 证书续期已用 --dry-run 验证过
- 备份文件已确认生成,并考虑异地再存一份