首页/系统/Linux 运维命令速查/timer 相对计时:OnBootSec/OnUnitActiveSec
定时任务与计划50 条

timer 相对计时:OnBootSec/OnUnitActiveSec

相对时间触发:开机后多久(OnBootSec)、上次激活后多久(OnUnitActiveSec);适合「开机后 10 分钟自检」「每 5 秒轮询」这类周期。

Linux 运维命令速查系统更新于 2026-10-13

相对计时触发是什么

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系统启动完成开机后固定延迟执行一次
OnStartupSecsystemd 实例启动(用户级常用)用户服务启动后自检
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。

易错点

  • 把 [Timer] 段写进 service 文件、[Install] 段写进 timer 之外的文件:enable 能成功但永远不触发,因为配对关系被破坏
  • 改完单元不执行 daemon-reload:旧定义继续生效,表现为“改了完全没反应”
  • 指望 OnBootSec/OnUnitActiveSec 补跑错过的时点:Persistent 只对 OnCalendar 生效,这两种写法不会补
  • 默认精度就断言任务不准时:AccuracySec 默认 1 分钟,需要秒级准时必须显式调小

数据来源与参考

  • man 5 systemd.timer
  • systemd.time(7)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌