debian 定时器的触发器类型
debian 的定时器基于 systemd,提供两大类触发器:一类是基于单调时钟的事件(随系统运行单调递增,适合“开机后/上次事件后多久”的调度),另一类是基于日历时间的事件(类似 cron,按“年-月-日 时:分:秒”的日历规则触发)。此外,还支持一次性定时与精度/时区等控制。
单调时钟触发器(monotonic timers)
- onbootsec:从系统启动完成开始计时的相对时间,例如 onbootsec=5d 表示开机后第 5 天触发。适合需要在每次启动后延迟执行的任务。该类型属于单调计时器,默认非持久,重启后会计时器重置。
- onstartupsec:从 systemd 启动阶段开始计时的相对时间,语义与 onbootsec 类似,但起点更早(启动流程起点)。
- onunitactivesec:以某个被关联的 unit 上一次变为活跃状态为起点,按相对时间再次触发,例如 onunitactivesec=1h 表示上次运行结束后每隔 1 小时再运行。
- onunitinactivesec:以某个被关联的 unit 上一次变为非活跃状态为起点,按相对时间触发。
- accuracysec:控制触发时间的精度窗口(如 1min),单调计时器可配合该指令使用,将触发对齐到指定粒度。
以上均为单调计时器,特点是时间基准随系统运行单调递增,不跨重启保留触发计数;如需“错过即补跑”,需改用日历定时器并配合 persistent。
日历时间触发器(realtime/calendar timers)
- oncalendar:按日历时间触发,可表达一次性或重复性事件,语法支持“年-月-日 时:分:秒”以及关键字(如 daily、weekly、monthly、yearly)与步长(如 mon,fri --* 09:00:00 表示每周一、周五 9 点)。适合绝大多数计划任务场景。
- 持久化与补跑:设置 persistent=true 后,若系统在预定时间处于关机/挂起而错过触发,会在下次开机时补执行一次,弥补 cron 的“错过即跳过”。
- 时区控制:通过 calendar 中的 tz=区域/城市(如 tz=asia/shanghai)指定时区,避免系统时区变化带来的偏差。
该类型与 cron 的“时间点/周期”模型最接近,但具备更强的日历表达力与系统级集成能力。
常见触发场景与配置要点
- 固定时刻:每天/每周/每月的固定时间,例如 oncalendar=daily 或 oncalendar=mon,fri 09:00:00;需要补跑时加 persistent=true。
- 间隔轮询:每隔 n 分钟/小时执行,例如 oncalendar=*:0/15(每 15 分钟);若需“开机后延迟再进入周期”,可叠加 onbootsec。
- 事件驱动:以上次任务结束为起点做固定间隔重试/巡检,例如 onunitactivesec=1h;适合“任务完成后间隔执行”。
- 一次性任务:使用 oncalendar 指定明确的一次性时间;若可能错过,结合 persistent=true 实现“开机补跑”。
- 精度与抖动:通过 accuracysec 控制对齐粒度,减少频繁唤醒带来的开销。