Cogs and Levers A blog full of technical stuff

A Light cron Tutorial

Introduction

cron is the time-based task scheduler for Unix. I think the wikipedia article sums up its description best, so I won’t try and reproduce it:

Cron is the time-based job scheduler in Unix-like computer operating systems. Cron enables users to schedule jobs (commands or shell scripts) to run periodically at certain times or dates.

Today’s post will be a light tutorial in setting up jobs using cron.

Job types

Within the cron system there are two flavors of tasks. The first is at the system level the other is at the user level. The main difference being, the system level tasks (controlled by administrators) are able to run as any particular user. User jobs are setup by the user and installed for the user.

Job installation and modification

Start an editing session of the cron table (crontab) by issuing the following command.

$ crontab -e

You’ll now be looking at the job definitions that are setup. To add a job to the list, you need to add it in the following format.

Minute Hours Day Month DayOfWeek Command [args]
  • Minute is specified as (0 - 59)
  • Hours is specified as (0 - 23)
  • Day is specified as (0 - 31)
  • Month is specified as (0 - 12 where 12 is December)
  • DayOfWeek is specified as (0 - 7 where 7 or 0 are Sunday)
  • Command is the shell command you want to execute

For a system level task, a new field to specify the username is added into this format.

Minute Hours Day Month DayOfWeek Username Command [args]

This will only apply to system level tasks that are added. Operators can be used in conjunction with literal values to short-cut some of the more common tasks.

  • Use an asterisk * to define all values for a field
  • Use a comma , to separate multiple values for a field
  • Use a dash - to define a range

To make some more sense out of the time fields, here are a few examples and when they’d execute.

Crontab entry Interval
0 1 * * * script.sh Run at 1 in the morning everyday
0 6 1 * * script.sh Run at 6am on the first of every month
0 11 * * 1-5 script.sh Run at 11am every weekday
0 17 5 5 * Run at 5 in the afternoon on the 5th of May
0 7-19/2 * * * Run every 2 hours from 7 in the morning until 7 at night

Out of the box, a cron job will email your local unix account with the results of the job run. If you don’t want to receive this email just pipe the output of your cron command to null, like so.

0 7 * * * test.sh >/dev/null 2>&1

Some short-cut “special variables” that you can use in conjunction with the times that these jobs run look like this (these really clean up the way a crontab reads).

Variable Meaning Cron equiv.
@reboot Run once, at startup  
@yearly / @annually Run once per year 0 0 1 1 *
@monthly Run once per month 0 0 1 * *
@weekly Run once per week 0 0 * * 0
@daily / @midnight Run once per day 0 0 * * *
@hourly Run once per hour 0 * * * *

Other maintenance

You can list the cron table with the following command.

$ crontab -l
$ crontab -u user -l

You can remove all entries out of the cron table with the following command.

$ crontab -r
$ crontab -u user -r

That’s it! A nice light tutorial.