相对计时触发是什么
systemd timer 支持用相对时间表达周期:OnBootSec 从系统启动算起,OnStartupSec 从 systemd 实例启动算起(用户级单元常用),OnUnitActiveSec 从上次对应 service 启动算起。用它描述“开机后十分钟自检”“每隔五分钟轮询”这类需求,比写死日历时刻的 OnCalendar 更贴合“开机即开始”的实际意图,也不用维护 cron 表达式。
基本信息
| 适用平台 | Linux(systemd) |
|---|---|
| 单元位置 | /etc/systemd/system/ 系统级;~/.config/systemd/user/ 用户级 |
| 关键指令 | OnBootSec、OnStartupSec、OnUnitActiveSec、AccuracySec、RandomizedDelaySec |
| 配对规则 | timer 与 service 必须同名(check.timer 对应 check.service) |
| 精度 | AccuracySec 默认为 1 分钟,需要准时必须显式调小 |
典型使用场景
- 开机后固定延迟做一次自检、上报或缓存预热
- 按固定间隔轮询队列、证书有效期、磁盘水位(不需要精确到某点)
- 替代 cron 做周期任务,省去维护日历表达式
- 批量机器启动时用 RandomizedDelaySec 错峰,避免同时压后端
- 用户级 timer 给个人任务做轻量调度,不动系统配置
完整示例
完整示例
# /etc/systemd/system/check.timer
[Unit]
Description=periodic app check
[Timer]
OnBootSec=10min # 开机后 10 分钟第一次触发
OnUnitActiveSec=5min # 之后每 5 分钟触发一次
AccuracySec=1s # 默认 1 分钟,需要准时就调小
RandomizedDelaySec=30s # 随机延迟,多机错峰
Persistent=true # 补跑错过的时点(仅对 OnCalendar 有意义)
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now check.timer
systemctl list-timers check.timer --no-pager # 看 LAST/NEXT 触发时间
systemctl cat check.service # 确认配对的 service 存在且同名指令怎么选
| 指令 | 计时起点 | 适合场景 |
|---|---|---|
| OnBootSec | 系统启动完成 | 开机后固定延迟执行一次 |
| OnStartupSec | systemd 实例启动(用户级常用) | 用户服务启动后自检 |
| OnUnitActiveSec | 上次启动对应 service 的时刻 | 固定间隔轮询 |
| OnCalendar | 日历表达式 | 需要精确到某点,如每天 03:00 |
| AccuracySec | 允许触发的误差窗 | 默认 1 分钟;调小会提高唤醒频率 |
OnUnitActiveSec 的间隔从上次启动 service 算起:任务执行时间超过间隔时下一次顺延,不会堆积出多个并发副本,这一点比单纯的 cron 更省心。
timer 只负责触发,真正干活的是同名的 .service;出问题先 systemctl status 那个 service 并看它的日志,而不是反复调 timer 表达式。
用 systemctl list-timers --all 能一次看到全部 timer 的 LAST、NEXT 与激活状态;排查“不触发”时先看 NEXT 是否为空,为空通常说明 timer 没 enable 或已被 stop。