速查表 · Cron 速查表 · Cron 每月最后一天执行 — Crontab 示例

Cron 每月最后一天执行 — Crontab 示例

59 23 L * *

在每月最后一天的 23:59 执行(28 号到 31 号,视当月天数而定)。

逐字段解释

字段值含义
分钟59第 59 分
小时23晚上 11 点
每月几号L当月最后一天
月份*每个月
星期几*星期几都行

cron 没有一个原生代表「最后一天」的数字,因为它在 28 到 31 之间变化。几号字段里的 L 正是为此而生 — 但它是扩展语法,由 Cronie(多数 Linux 发行版)、Quartz 和部分云调度器支持,经典 POSIX cron 并不认。

可移植的兜底办法是每晚都跑,由脚本自己判断明天是不是 1 号:

59 23 * * * [ "$(date -d tomorrow +\%d)" = "01" ] && /usr/local/bin/month-end.sh

相关调度

常见问题

我的 cron 拒绝接受 L,为什么?
你用的实现早于 L 扩展。查 man 5 crontab 里有没有提到 L 或 last;没有的话就用上面那个每日判断的兜底写法。

为什么 crontab 那行里 % 要写成两个?
在 crontab 中,裸的 % 会开始命令的 STDIN 段。凡是需要字面百分号(比如 date 的格式串)都得转义成 \%。

选 23:59 是有原因的吗?
有 — 它保证运行仍落在最后一天里。00:00 严格来说已经是下个月的 FIRST 天,任何会读日期的逻辑都会被「最后一天」这个语义打崩。

别死记语法 — 用可视化生成器

在 Cron 编辑器里试用这些排程

完整速查表:Cron 速查表