问题场景还原
在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