首页/系统/信创系统运维速查/OnCalendar 日历表达式写法
服务与运维65 条

OnCalendar 日历表达式写法

OnCalendar 支持 * 通配、.. 区间、逗号枚举与 / 步进;写法不确定时先用 systemd-analyze calendar 验证并查看下次触发时间。

信创系统运维速查系统更新于 2026-10-13

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 里该服务的执行与报错记录

与计划任务怎么选

  • 需要统一日志与依赖顺序时用定时器
  • 需要补跑停机期间任务时核对持久化选项
  • 单机简单周期任务可用系统计划任务
  • 需要秒级间隔触发时用间隔写法

易错点

  • 0/6 与 6/6 混为一谈:前者从 0 点起每 6 小时,后者从 6 点起每 6 小时,上线前用 systemd-analyze calendar 验证
  • 宏名与显式表达式含义不一致:daily 与自定义写法看似相同,实际触发时刻可能不同,以验证工具输出为准
  • 只写 OnCalendar 不配 Persistent:机器停机错过的时间点不会补跑,需要补跑时显式开启该选项
  • timer 没有对应的 service 单元或不写 Unit=:触发时找不到要执行的目标,任务静默不执行
  • 改完 timer 不做 daemon-reload:新配置不会加载,改完要用 list-timers 确认下次触发时间已更新
  • 把周期任务改成定时器却不改监控:日志位置与告警规则要同步更新,否则任务静默失败无人发现

数据来源与参考

  • man 7 systemd.time(日历表达式)
  • man 1 systemd-analyze(calendar)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌