@yearly in production
What @yearly actually does
@yearly expands to 0 0 1 1 * — 00:00 on January 1st — and @annually is a full alias: same expansion, same behavior, both accepted by every Vixie-compatible daemon. It is the rarest of the macros because so few workloads are genuinely annual: TLS CA rotations, compliance and audit scans, archive purges governed by retention policy, and yearly recap jobs.
Note the trap in the name: @yearly means calendar-year, January 1st. Fiscal years, contract years, and subscription years almost never start on January 1st, so anything keyed to them needs an explicit expression — 0 0 1 4 * for an April fiscal start, for example. AWS EventBridge's year field gives you ranges and lists natively (0 0 1 1 ? 2027-2030) when the schedule itself is bounded.
January 1st is a holiday — schedule accordingly
00:00 on New Year's Day is the single worst-manned timestamp of the year: skeleton on-call crews, systems mid-maintenance window, and nobody reading dashboards. A long-running annual job that misbehaves there can burn most of the holiday before anyone notices. For annual jobs that touch anything human-facing, 0 0 2 1 * (January 2nd) or the first business day of January is the pragmatic choice; there is no macro for it, so write the fields.
The second annual-job failure mode is silence: a job that runs once a year gets touched once a year, and by next January the credentials it used have expired, the API it calls has been deprecated, or the disk it writes to filled up in March. The standard defenses are a scheduled dry-run months earlier, success alerting that pages like any other job, and version-controlling the script instead of editing it live in crontab.
Common questions
Is @yearly the same as @annually?
Yes — @annually is a documented alias with the identical expansion, 0 0 1 1 *. Either spelling fires at 00:00 on January 1st.
What date and time does @yearly run?
00:00 on January 1st, in the cron daemon's timezone (UTC on most servers). It expands to 0 0 1 1 *.
How do I schedule a job yearly on a different date?
Write the month and day explicitly. 0 0 1 4 * fires at midnight on April 1st every year; 0 9 15 6 * at 09:00 on June 15th. There is no parameterized macro form.
What is the Quartz or AWS EventBridge equivalent of @yearly?
Quartz: 0 0 0 1 1 ? — seconds first and '?' in day-of-week. AWS EventBridge: 0 0 1 1 ? *, where the trailing year can also bound the schedule, e.g. 0 0 1 1 ? 2027.