服务器上的重复劳动——每天备份、定时清日志、周期性跑数据、续证书——都该交给机器自动完成。Linux的crontab就是这个”定时闹钟”。本文十分钟教你配好定时任务,并重点讲清新手最常踩的”任务不执行”的坑。
一、crontab基本操作
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看已有任务
crontab -r # 清空任务(慎用)
每一行就是一个任务,格式为五个时间字段 + 要执行的命令。
二、看懂时间格式(五个星号)
# 分 时 日 月 周 命令
* * * * * command
# 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-7,0和7都是周日)
常用表达式速查:
0 3 * * *—— 每天凌晨3点(备份黄金时段);*/10 * * * *—— 每10分钟一次;0 */6 * * *—— 每6小时一次;0 4 * * 0—— 每周日凌晨4点;0 0 1 * *—— 每月1号零点。
三、实战:每天自动备份数据库
先写一个备份脚本 /root/backup.sh:
#!/bin/bash
DATE=$(date +%F)
mysqldump -u root -p'密码' --all-databases | gzip > /backup/db_$DATE.sql.gz
# 删除7天前的旧备份
find /backup -name "db_*.sql.gz" -mtime +7 -delete
赋予执行权限并加入crontab:
chmod +x /root/backup.sh
crontab -e
# 添加一行:每天凌晨3点执行
0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
结尾的 >> 日志 2>&1 很关键——把输出和错误都记进日志,出问题时才有迹可循。
四、”crontab不执行”六大常见原因
这是最高频的求助问题,几乎都逃不出这六条:
- 用了相对路径:cron的运行环境很”干净”,命令和文件都要写绝对路径(
/usr/bin/python3而非python3); - 环境变量缺失:cron不加载你的 .bashrc,脚本里依赖的PATH、变量需在脚本内显式声明;
- 脚本没有执行权限:
chmod +x别忘; - 时区不对:服务器时区与你以为的不一致,
timedatectl确认,海外服务器尤其注意(如香港节点默认可能非北京时间); - 百分号未转义:命令中的
%在crontab里有特殊含义,需写成\%; - 没重启/没保存:
crontab -e保存即生效,无需重启;但改系统级 /etc/crontab 后建议重载cron服务。
排查神器:查看cron自身的执行日志 grep CRON /var/log/syslog(Debian/Ubuntu),能看到任务有没有被触发、报了什么错。
五、进阶提示
- 任务多了给每行加注释说明用途,半年后的你会感谢现在的自己;
- 重要定时任务(如备份)配合监控告警——任务失败要能收到通知,否则”以为在备份,其实早停了”是最危险的错觉;
- 需要秒级或复杂依赖的调度,考虑systemd timer或专门的任务调度工具。
把重复劳动交给crontab,你的服务器就有了”自动驾驶”能力。在免费试用的香港VPS上配一个每分钟写时间戳的测试任务,观察它准时触发——这是理解cron最快的方式。