systemd定时器OnCalendar语法详解:如何设置每小时10分至23:10执行任务


阅读 4 次

问题场景还原

在Ubuntu 22.04.2 LTS系统(systemd 219版本)中配置定时任务时,需要实现每天从10:10到23:10期间,每小时的第10分钟执行一次服务。典型的错误配置如下:

[Unit]
Description=每小时10分执行任务

[Timer]
OnCalendar= *-*-* 10-23:10/5:00
Persistent=true

[Install]
WantedBy=timers.target

systemd时间表达式解析

systemd的OnCalendar采用类似cron但更灵活的时间表达式,基本格式为:

星期 年-月-日 时:分:秒

其中每个字段都支持通配符(*)和范围表示,但小时和分钟之间不能用连字符表示范围,这是导致配置失败的根本原因。

正确的时间范围配置方案

要实现每小时10分执行,直到23:10,正确的配置应该是:

[Timer]
OnCalendar= *-*-* 10,11,12,13,14,15,16,17,18,19,20,21,22,23:10:00

或者使用更简洁的表示方式:

[Timer]
OnCalendar= *-*-* 10..23:10:00

完整可用的timer配置示例

以下是经过验证的正确配置:

[Unit]
Description=每天10:10至23:10每小时执行

[Timer]
OnCalendar= *-*-* 10..23:10:00
AccuracySec=1min
Persistent=true

[Install]
WantedBy=timers.target

常见错误排查

如果仍然遇到问题,建议检查:

  • systemd版本是否支持范围语法(219版本已支持)
  • 时间表达式各字段间必须有空格
  • 分钟和秒必须用冒号分隔
  • 使用systemd-analyze verify your.timer验证配置文件

高级用法扩展

如果需要更复杂的时间控制,可以考虑:

# 工作日10:10-18:10执行
OnCalendar= Mon..Fri *-*-* 10..18:10:00

# 每月1号10:10-15:10执行
OnCalendar= *-*-01 10..15:10:00