Here’s what I’ve been doing for most of my life, when it comes to writing
0 */2 * 1 3 /run/this/on/wednesday.sh
The above is the arcane way of saying: run this job every 2 hours on every Wednesday in January.
But I only just recently learned you can replace the weekday and month with a human-readable form, if your cron version is recent enough.
0 */2 * JAN WED /run/this/on/wednesday.sh
It doesn’t help the
0 */2 ... syntax, but it’s a lot easier to see
WED means Wednesday and
JAN means January!
What else can you do in a crontab?
While some of these may be obvious if you’ve used crontab for a while, it is good to know the syntax allows for pretty flexible entries.
This example shows you how to run a command ever hour between 8AM and 3PM, including those hours themselves.
0 8-15 * * * /script.sh
An alternate approach is to list the digits comma-separated.
0 8,9,10,11,12,13,14,15 * * * /script.sh
This would make sense if there’s a single hour you don’t want to run a command, you can simply leave it out of your comma-separated list.
This is the part of the crontab syntax that confuses most:
0 */2 * * * /script.sh
*/2 part can be read as: every 2 hours.
You can also pass a range with a step value:
0 0-12/2 * * * /script.sh
This one means: run this every 2 hours for all hours between 0 and 12.
Month and week names
Like I mentioned at the top, you can use the first 3 letters of a week or month to specify the entry.
0 0 * AUG SUN /script.sh
The above would run every Sunday in August at midnight.
Gotchas and booby traps
What does this Syntax do?
30 4 1,15 * 5 /script.sh
This would run a command on the 1st and 15th of each month, as well as on every Friday. The
1,15 in the day section and the
5 in the weekday are interpreted as an “either may match”, not a “should match both”.
Cron has some special shortcuts available to you, if you don’t want to write the arcane syntax every time.
string meaning ------ ------- @reboot Run once, at startup. @yearly Run once a year, "0 0 1 1 *". @annually (same as @yearly) @monthly Run once a month, "0 0 1 * *". @weekly Run once a week, "0 0 * * 0". @daily Run once a day, "0 0 * * *". @midnight (same as @daily) @hourly Run once an hour, "0 * * * *".
This means you can do this:
0 0 * * * /script.sh
@daily is more readable.
Any more tricks?
What other crontab magic am I missing here?