systemd定时器→Cron表达式转换工具

将systemd定时器的OnCalendar=语法转换为cron表达式(分 时 日 月 星期)的免费工具。是姊妹工具"Cron转systemd定时器"的逆向转换。支持daily、weekly等命名快捷方式,并在同时指定日期和星期时给出语义差异警告。

systemd组件与cron字段对应表

systemd的OnCalendar=语法各部分与cron表达式的5个字段对应关系如下。

位置 systemd中的对应位置 cron字段
1 时间部分的分(HH:MM:SS中的MM)
2 时间部分的时(HH:MM:SS中的HH)
3 日期部分的日(年-月-日中的日) 日(日期)
4 日期部分的月(年-月-日中的月)
5 星期前缀(例如:Mon、Mon..Fri) 星期

systemd的秒指定(HH:MM:SS中的SS)没有对应的cron字段,转换时会被忽略(若秒不为"00"会显示警告)。

systemd星期缩写与cron星期编号对应表

systemd使用英文星期缩写,而cron使用0~6的数字表示。

systemd星期缩写 cron星期编号
Sun 0
Mon 1
Tue 2
Wed 3
Thu 4
Fri 5
Sat 6

systemd命名快捷方式与cron表达式对应表

systemd有"daily"、"weekly"等易读的命名特殊写法,本工具也支持将它们转换为cron表达式。

OnCalendar= cron表达式
minutely * * * * *
hourly 0 * * * *
daily / midnight 0 0 * * *
weekly 0 0 * * 1
monthly 0 0 1 * *
yearly / annually 0 0 1 1 *

常见转换示例

OnCalendar= cron表达式 含义
*-*-* *:*:00 * * * * * 每分钟执行一次(相当于cron的"* * * * *")。
*:00/15:00 */15 * * * * 每15分钟执行一次。
Mon..Fri 09:00:00 0 9 * * 1-5 在工作日(周一至周五)的9点0分执行。
*-*-01 00:00:00 0 0 1 * * 每月1日的0点0分执行。
*-01-01 00:00:00 0 0 1 1 * 每年1月1日的0点0分执行。
Mon *-*-01 00:00:00 0 0 1 * 1 同时指定日期(1日)和星期(周一)的示例。systemd中为AND条件(须同时满足),但cron中会被解释为OR条件(满足其一即可),因此转换结果的执行频率会比原OnCalendar表达式更高,请注意。

将日期和星期都限制为非"*"的OnCalendar表达式无法准确转换为cron表达式(因为systemd是AND条件,而cron是OR条件)。遇到此类情况请务必确认转换结果的含义。

使用提示

  • 可以直接输入"daily"、"weekly"、"monthly"等命名快捷方式,内部会转换为对应的cron表达式(例如daily会转换为"0 0 * * *")。
  • 将日期和星期都指定为非"*"时,将systemd的AND条件转换为cron的OR条件会改变含义。此时请务必确认警告并检查转换结果是否符合预期。
  • OnCalendar语法中的年份和秒指定在cron中没有对应字段,转换时会被忽略(会通过警告提示)。
  • 在迁移到Kubernetes CronJob(使用cron格式的调度语法)等场景中,本工具可用于将systemd定时器转回cron格式。
  • 对于不同时使用星期和日期的简单调度(每小时、每天、每周等),此转换始终准确一致。

常见问题

当迁移到不支持systemd的轻量级Docker容器,或需要在使用cron格式调度语法的Kubernetes CronJob中重现相同的定期执行,或团队的运维工具只支持cron格式配置时,就需要将现有的systemd定时器配置转换回cron表达式。

可以。直接输入"minutely"、"hourly"、"daily"、"weekly"、"monthly"、"yearly"等systemd命名快捷方式,会转换为对应的cron表达式。

在systemd的OnCalendar语法中,星期指定和日期指定始终是AND条件(须同时满足)。而在传统的Vixie cron规范中,若日期和星期都被限制为非"*",则会成为OR条件(满足其一即可)。因此本工具在检测到此情况时会显示警告,提示转换结果可能比原OnCalendar表达式更宽泛(执行频率更高)。

由于cron表达式没有指定年份的字段,即使OnCalendar表达式中有年份指定(非"*"的值),转换为cron时也会被忽略。本工具在此情况下会显示警告,说明转换结果将不论指定的年份每年都会执行。

本工具涵盖了姊妹工具cron_to_systemd生成的主要模式(每分钟、每小时、每天、每周、每月、每年、步进指定、范围指定、列表指定、星期指定、命名快捷方式),但由于OnCalendar语法比cron表达能力更强,非常复杂的指定(多个年份、秒级的精细重复等)无法用cron准确表示,可能转换失败。
ツールくん

闲话 ― 从systemd定时器"回归"cron意味着什么

技术迁移通常被描述为单向的(从旧机制迁移到新机制),但在实际工作中,反方向的转换也并不少见。将工作负载从采用systemd的主机环境迁移到只支持cron的轻量级容器,或迁移到采用cron格式调度语法的编排工具(如Kubernetes CronJob)时,就需要将OnCalendar语法转换回cron表达式。

这种"逆向转换"之所以不是简单的一对一对应,是因为systemd的OnCalendar语法比cron表达能力更强,具备年级别指定、秒级精度、日期与星期的AND条件组合等cron的5个字段无法完全表达的概念。因此本工具的目标是"准确转换常用的主要模式",对于无法完全覆盖的复杂指定则作为转换错误处理。

同时指定日期和星期时的语义差异(systemd为AND条件,cron为OR条件)是这种逆向转换中最大的陷阱。对于"每月1日"且"星期一"这样的条件,systemd只会锁定"既是1日又是星期一"的那一天,而cron则会在"是1日的日子"或"是星期一的日子"两种情况下都执行。本工具明确警告这一点,正是为了让用户注意到迁移时容易被忽略的这种含义变化。