Linux 定时任务入门:用 crontab 写出不踩坑的计划任务
在服务器上定期备份数据库、清理日志、拉取报表,最常用的工具就是 cron。它几乎所有 Linux 发行版都自带,配置只需要一行。不过很多人第一次写 crontab 时会遇到“手动执行没问题,定时却不跑”的情况。本文从语法讲起,再总结几个最常见的坑。
一、crontab 的基本语法
用 crontab -e 编辑当前用户的计划任务,每行由五个时间字段加一条命令组成,依次是分钟、小时、日、月、星期。
# 每天凌晨 2:30 备份数据库
30 2 * * * /home/app/bin/backup.sh
# 工作日每小时的第 0 分钟检查一次服务
0 * * * 1-5 /home/app/bin/check.sh
# 每 15 分钟同步一次
*/15 * * * * /home/app/bin/sync.sh
星号表示“每个”,逗号表示列举,短横线表示范围,斜杠表示间隔。写完后可以用 crontab -l 查看是否保存成功。
二、坑一:环境变量不一样
cron 执行命令时使用的是一个非常精简的环境,PATH 往往只有 /usr/bin 和 /bin,也不会加载 .bashrc。手动能运行的脚本,在 cron 里可能找不到 python、node 等命令。解决办法是在脚本里使用绝对路径,或者在 crontab 顶部显式写上 PATH,例如 PATH=/usr/local/bin:/usr/bin:/bin。
三、坑二:没有输出就不知道失败
默认情况下,cron 任务的输出会尝试以邮件形式发送,大多数服务器没有配置邮件,结果就是错误信息直接丢失。建议把输出重定向到日志文件:
30 2 * * * /home/app/bin/backup.sh >> /var/log/backup.log 2>&1
排查时还可以查看系统日志,确认 cron 是否真的触发了任务,例如 grep CRON /var/log/syslog 或 journalctl -u cron。
四、坑三:任务重叠执行
如果一个每 5 分钟执行的任务某次跑了 8 分钟,下一次就会和它同时运行,可能导致数据重复写入。可以用 flock 加一把文件锁,保证同一时刻只有一个实例:
*/5 * * * * flock -n /tmp/sync.lock /home/app/bin/sync.sh
五、坑四:时区与百分号
cron 使用的是系统时区,云服务器默认可能是 UTC,写“每天 8 点”时要先用 timedatectl 确认时区。另外,crontab 里的百分号有特殊含义,用 date 生成文件名时要写成 \%Y\%m\%d。
六、小结
写好一条定时任务,记住四点:使用绝对路径、输出写日志、防止重叠、确认时区。任务多起来之后,也可以考虑改用 systemd timer 或云上的定时触发器,统一管理和告警。
- 点赞
- 收藏
- 关注作者
评论(0)