piapia123
zh

systemd 定时器:OnCalendar 解析与单元生成

网络

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

`OnCalendar=` 长得像 cron,但语义不一样,坑也都藏在细节里。`a/b` 是步进(`*:0/15` 是每小时的第 0、15、30、45 分),`~N` 表示从月末倒数,星期与月份可以写名字;而最容易写错的一条是:星期与日期同时指定时是「且」而不是「或」 —— 与 cron 恰好相反。这个工具按你选的时区算出接下来几次触发时刻(同时给出本地时间与 UTC)、逐段解释表达式,并生成配套的 .timer 与 .service。 解析与计算全部在你的浏览器里完成(时区换算用浏览器自带的日期能力),不联网、不发送表达式。

功能

  • 解析 *、a..b 区间、a/b 步进、名字形式的星期与月份、~(月末倒数)
  • 按所选时区算出接下来 1–20 次触发时刻
  • 每个时刻同时给出本地时间与 UTC
  • 逐段解释星期、日期、时间分别是什么意思
  • 生成配套的 .timer 与 .service 单元文件
  • 直接粘贴整段 .timer 文件也能解析
  • 专门提醒 systemd 与 cron 的「且 / 或」差异
  • 全部本地计算,不联网

使用方法

  1. 输入 OnCalendar 的值,或粘贴整段 .timer 文件
  2. 选时区,并决定列出几次
  3. 看接下来的触发时刻与逐段解释
  4. 复制生成的 .timer 与 .service

常见问题

OnCalendar 和 cron 有什么区别?
两处关键差异。第一,星期与日期同时指定时,cron 是「或」、systemd 是「且」:cron 的 `0 9 * * 1` 是每周一 9 点,而 systemd 的 `Mon *-*-01 09:00` 是「既是周一、又是 1 号」,一年只出现几次。第二,systemd 可以写多个 `OnCalendar=` 触发同一个单元(相当于「或」),还能写名字形式的星期与月份,可读性更好。
*:0/15 是什么意思?
是「每小时的第 0、15、30、45 分」。这里 `0/15` 的读法是从 0 开始、每 15 步一次、一直到该字段的上界(分钟是 59),所以会得到 0、15、30、45。把 `0/15` 误解成「0 到 0」会只剩一个 0 —— 不报错,但全错。
为什么时区会影响结果?
因为 `OnCalendar=` 按本地时区求值。同一个 `*-*-* 03:00:00`,在 UTC 机器上对应 03:00 UTC,在上海机器上对应 19:00 UTC(前一天)。所以这个工具让你显式选时区,并把结果同时给出本地时间与 UTC —— 把单元文件搬到别的机器前,先确认那台机器的时区。
`~` 是什么?
表示从月末倒数的天。`*-*-~1` 是每月最后一天,`*-02-~03` 是二月的倒数第三天 —— 而且它会跟着月份长度自动变(闰年二月是 29 天,倒数第三天就是 27 号)。这比写死 `28` 可靠得多。
为什么 .timer 还要配一个 .service?
因为 systemd 里 timer 只负责「什么时候触发」,被触发时要跑什么写在 service 里。两者通常同名(`backup.timer` 触发 `backup.service`),也可以用 `Unit=` 指定别的名字。这个工具生成的是一对可用的骨架,`ExecStart=` 需要你换成自己的命令。

相关工具