特殊字符串是什么
cron 支持用 @ 开头的特殊字符串替代五段式时间字段,写法更直观:@reboot 在 cron 守护进程启动时执行一次,@daily 等价 0 0 * * *,@hourly 等价 0 * * * *。要特别注意 @reboot 的语义是「cron 启动时」而不是「系统完成启动时」:它不保证网络、存储或数据库已经就绪,把需要依赖的服务交给它是常见错误。需要启动顺序保证的场景,应当使用 systemd 单元并声明依赖关系。
基本信息
| 适用平台 | Linux(cronie、vixie-cron 等主流实现) |
|---|---|
| 语法 | @reboot|@yearly|@annually|@monthly|@weekly|@daily|@midnight|@hourly 命令 |
| 等价关系 | @hourly = 0 * * * *,@daily 与 @midnight = 0 0 * * *,@weekly = 0 0 * * 0 |
| 兼容性局限 | 精简实现(busybox crond、部分容器镜像)不支持 @ 系列 |
| 时间基准 | 与五段式写法一致,依赖系统时区与系统时钟 |
典型使用场景
- 开机执行一次准备工作,如生成缓存或预热数据
- 用简写替代常见周期表达式,提高可读性
- 阅读他人 crontab 时快速判断执行频率
- 从 cron 迁移到 systemd 计时器时做语义对照
- 在文档与代码评审中统一时间表达方式
示例
示例
@reboot /opt/app/start.sh # cron 守护启动时执行一次
@daily /opt/app/clean.sh # 等价 0 0 * * *
@hourly /opt/app/check.sh # 等价 0 * * * *
@weekly /opt/app/rotate.sh # 等价 0 0 * * 0
@monthly /opt/app/report.sh # 等价 0 0 1 * *
@reboot sleep 30 && /opt/app/wait-db.sh # 自行等待依赖就绪后再执行特殊字符串等价对照
| 写法 | 等价时间字段 | 说明 |
|---|---|---|
| @yearly 与 @annually | 0 0 1 1 * | 每年 1 月 1 日零点 |
| @monthly | 0 0 1 * * | 每月 1 日零点 |
| @weekly | 0 0 * * 0 | 每周日零点 |
| @daily 与 @midnight | 0 0 * * * | 每天零点 |
| @hourly | 0 * * * * | 每小时整点 |
| @reboot | 无等价写法 | cron 守护启动时执行一次 |
@reboot 不保证系统就绪时序,cron 可能早于网络与存储挂载。启动服务应使用 systemd 单元,并用 After= 与 Requires= 声明依赖关系。
精简 cron 实现(busybox crond 与部分容器镜像)不支持 @ 系列。上线前先在目标环境验证一条测试任务,否则任务会静默不执行。
@ 系列不能与五段式时间字段混写,形如 @daily 0 0 * * * cmd 属于语法错误。在不需要简写语义的环境里,直接使用等价的时间字段更保险。
@reboot 的触发点是 cron 守护进程启动,而不是内核完成启动。手工重启 cron 服务也会触发它,任务可能在非预期时刻被重复执行。