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 的「且 / 或」差异
- 全部本地计算,不联网
使用方法
- 输入 OnCalendar 的值,或粘贴整段 .timer 文件
- 选时区,并决定列出几次
- 看接下来的触发时刻与逐段解释
- 复制生成的 .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=` 需要你换成自己的命令。
相关工具
配置校验
网络校验 package.json、.env、robots.txt、sitemap.xml 与 HTTP 响应头,结论分错误、警告、建议三级,每条都说明为什么。全部在浏览器本地完成。
Compose 与 docker run 互转
网络compose 的 services 段与 docker run 命令双向互转。转不过来的键逐条列出并说明原因,不静默丢弃;镜像与命令按位置切开,不会被误当成选项。
Linux 权限计算
网络在 755、u+x,g-w 与 -rwxr-xr-x 三种写法之间互转,逐位解释每一项权限,并按 umask 推算新建文件与目录的默认权限。全部在浏览器本地完成。
URL 解析
网络在线 URL 解析:拆出协议、主机、端口、路径、查询参数与锚点,参数逐个解码并与原始值对照,缺协议自动补 https://。全部在浏览器本地完成。
UA 解析
网络在线 User-Agent 解析:识别浏览器、版本、操作系统、设备类型与渲染引擎,并列出命中的匹配规则。结果基于模式匹配,仅供参考。全部在浏览器本地完成。
HTTP 状态码
网络HTTP 状态码查询与速查:输入编号查含义、1xx 到 5xx 分类、常见场景与排查提示,也能用关键词反查编号。全部在浏览器本地完成。