Different ways of writing crontab syntax

Oh Dear monitors your entire site, not just the homepage. We crawl and search for broken pages and mixed content, send alerts when your site is down and notify you on expiring SSL certificates.

Start your free 10 day trial! »

Profile image of Mattias Geniar

Mattias Geniar, April 26, 2020

Follow me on Twitter as @mattiasgeniar

Here’s what I’ve been doing for most of my life, when it comes to writing crontab entries:

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.

Step values

This is the part of the crontab syntax that confuses most:

0 */2 * * * /script.sh

The */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”.

Special shortcuts

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:

@daily /script.sh

instead of:

0 0 * * * /script.sh

At least @daily is more readable.

Any more tricks?

What other crontab magic am I missing here?

Want to subscribe to the cron.weekly newsletter?

I write a weekly-ish newsletter on Linux, open source & webdevelopment called cron.weekly.

It features the latest news, guides & tutorials and new open source projects. You can sign up via email below.

No spam. Just some good, practical Linux & open source content.