OnCalendar 是什么
OnCalendar 是 systemd timer 的日历表达式,用来描述任务在什么时刻触发。它支持通配、区间、枚举与步进:Mon..Fri 表示工作日,0/6 表示从 0 点起每 6 小时,逗号可以枚举多个时刻。写法不确定时先用 systemd-analyze calendar 验证,它会解释表达式并给出下次触发时间。适用于所有 systemd 发行版。
基本信息
| 所属单元 | timer 单元的 [Timer] 段 |
|---|---|
| 常用宏 | hourly、daily、weekly、monthly |
| 区间写法 | Mon..Fri 表示周一到周五 |
| 枚举 | 02,14:30:00 表示两个时刻 |
| 验证工具 | systemd-analyze calendar |
典型使用场景
- 替代计划任务做定时脚本,日志统一进 journal
- 只在工作日执行巡检与报表任务
- 每天固定两个时间点触发同步
- 开机后延迟一段时间再执行初始化任务
- 需要精确控制触发时刻与依赖顺序的场景
常用写法
常用写法
OnCalendar=hourly # 每小时整点(等价 *-*-* *:00:00)
OnCalendar=daily # 每天 00:00
OnCalendar=Mon..Fri *-*-* 08:00:00 # 工作日早上八点
OnCalendar=*-*-* 02,14:30:00 # 每天 02:30 与 14:30
OnCalendar=Sun *-*-* 03:00:00 # 每周日 03:00
OnCalendar=*-*-* 0/6:00:00 # 每 6 小时一次验证表达式
验证表达式
systemd-analyze calendar 'Mon..Fri *-*-* 09:00:00' # 看解释与下次触发
systemd-analyze calendar '*-*-* 0/6:00:00' --iterations=3 # 连续列出三次
systemd-analyze calendar 'weekly' --iterations=3
systemctl list-timers --all | head -10 # 查看系统内全部定时器表达式片段对照
| 写法 | 含义 | 示例 |
|---|---|---|
| * | 任意值 | *-*-* 表示任意日期 |
| .. | 区间 | Mon..Fri 工作日 |
| , | 枚举多个值 | 02,14 两个小时 |
| / | 从起点步进 | 0/6 从 0 点每 6 小时 |
| 宏名 | 预定义简写 | daily 等价每天零点 |
触发时刻按系统时区执行,先确认 timedatectl 的时区设置;跨时区集群里同一份表达式在不同节点上的实际触发时间可能不同。
定时器不触发怎么查
- 确认 timer 与对应 service 单元都存在
- 确认 timer 已启用并处于等待状态
- 用 list-timers 核对下次触发时间
- 验证日历表达式是否被正确解析
- 查 journal 里该服务的执行与报错记录
与计划任务怎么选
- 需要统一日志与依赖顺序时用定时器
- 需要补跑停机期间任务时核对持久化选项
- 单机简单周期任务可用系统计划任务
- 需要秒级间隔触发时用间隔写法