Linux Cron 定时任务入门
Cron 入门到实战:crontab 五段时间语法、编辑与管理、脚本执行环境差异(PATH/环境变量)、输出监控与失败告警。附常见坑与排查清单。
直接回答:Cron 是 Unix 系的定时任务调度器——crontab -e 编辑任务表,每行五段时间(分 时 日 月 周)+ 命令。最经典的坑是执行环境与交互 shell 不同(PATH 极简、不会完整继承交互式环境);监控任务输出的标准做法是重定向到日志文件,关键任务配心跳告警。
五段时间语法
┌ 分(0-59) ┌ 时(0-23) ┌ 日(1-31) ┌ 月(1-12) ┌ 周(0-6,0=周日)
* * * * * command
*/10 * * * * /opt/jobs/heartbeat.sh
# 每 10 分钟
30 3 * * * /opt/jobs/backup.sh
# 每天 3:30
0 9 * * 1-5 /opt/jobs/report.sh
# 工作日 9:00
快捷写法:@daily、@hourly、@reboot(cron 守护进程启动时,具体行为依实现)。
管理 crontab
crontab -e # 编辑当前用户任务表
crontab -l # 列出
crontab -r # 删除(危险,无确认)
系统级任务放 /etc/cron.d/,比个人 crontab 更易管理(含 user 字段、可进版本控制)。
最大的坑:执行环境
日和星期字段同时受限时,常见 Vixie/Cronie 实现按“或”匹配;同时核对时区、夏令时、任务是否重叠。crontab 注释宜单独成行,命令中的百分号通常要转义。
cron 环境极简 PATH(通常只有 /usr/bin:/bin)、无 .bashrc 加载、无 SSH agent。脚本里:
- 命令用绝对路径(
/usr/bin/pg_dump而非pg_dump) - 脚本开头显式
export PATH=或 source 环境文件 - 先手动
env -i /bin/sh -c '你的命令'模拟干净环境测试
输出与监控
30 3 * * * /opt/jobs/backup.sh >> /var/log/backup.log 2>&1
静默失效是最大风险——cron 通常可通过本地 MTA 邮寄命令输出,但 MTA、MAILTO 和投递链路未配置时不能依赖它告警。关键任务(备份、结算)必须配心跳监控。
让脚本记录任务名、本次运行标识、开始和完成时间及退出码,才能区分“没有启动”“执行失败”和“尚未完成”。将上面的日志文件送入观测云时,按 DataKit 日志采集指南设置路径与读取权限,先执行一次测试任务,检查开始和完成记录是否都已收到。再按任务周期设置检查窗口,避免把正常的长任务误判为未执行。
常见问题(FAQ)
Q:cron 和 systemd timer 怎么选?
A:cron 简单通用、人人会;systemd timer 可与 service 依赖、journal 集成;失败重试需在服务/任务层另配,不是 timer 默认保证。新系统上复杂任务推荐 timer,cron 留给简单场景。
Q:任务跑了但没效果?
A:常见原因之一是环境差异——手动用干净环境模拟测试;查 /var/log/syslog 或 journal 里 cron 的执行记录;输出重定向必须有。
Q:同一任务防重入怎么做?
A:使用 flock 配合当前用户独占、预先建立的锁目录;不要只检查锁文件是否存在,检查和创建之间有竞态。长任务跨分钟触发时这是必修课。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。