Run a Cron Job Once a Year
Use @yearly (or its alias @annually) to run a job once a year at midnight on January 1st. It is shorthand for 0 0 1 1 *. To run yearly on a different date, set the day-of-month and month fields directly.
The shorthand
@yearly and @annually are identical named schedules meaning once a year at 00:00 on January 1st. They expand to 0 0 1 1 *.
Pick a different yearly date
Write the fields explicitly. For 9 AM on March 15th every year use 0 9 15 3 * — minute 0, hour 9, day 15, month 3, any weekday.
Why not a step?
There is no 'every 12 months' step needed — leaving the month field at a single value already makes it fire once per year. A specific day-of-month plus a specific month is the whole trick.
FAQ
What is the cron expression to run once a year?
Use @yearly (or @annually), which equals 0 0 1 1 * — midnight on January 1st. For another date set the day and month, e.g. 0 9 15 3 * for March 15th at 9 AM.
What's the difference between @yearly and @annually?
None — they are aliases for the same schedule, 0 0 1 1 *.
How do I run a cron job every year on a specific date?
Set the day-of-month and month fields: 0 0 15 6 * runs at midnight every June 15th.