Bookmark this page

Scheduling Recurring Jobs with cron

  • crontab -e edits a user crontab.

  • Six columns in a crontab: Minutes, Hours, Day-of-Month, Month, Day-of-Week, and Command.

Objective

After completing this section, students should be able to schedule recurring jobs with cron.

Scheduling recurring jobs with cron

Introduction to cron

Using at, one could, in theory, schedule a recurring job by having the job resubmit a new job at the end of its execution. In practice, this turns out to be a bad idea. Red Hat Enterprise Linux systems ship with the crond daemon enabled and started by default specifically for recurring jobs. crond is controlled by multiple configuration files, one per user (edited with the crontab(1) command), and systemwide files. These configuration files give users and administrators fine-grained control over exactly when their recurring jobs should be executed. The crond daemon is installed as part of the cronie package.

If the commands run from a cron job produce any output to either stdout or stderr that is not redirected, the crond daemon will attempt to email that output to the user owning that job (unless overridden) using the mail server configured on the system. Depending on the environment this may need additional configuration.

Scheduling jobs

Normal users can use the crontab command to manage their jobs. This command can be called in four different ways:

CommandIntended use
crontab -l

List the jobs for the current user.

crontab -r

Remove all jobs for the current users.

crontab -e

Edit jobs for the current user.

crontab <filename>

Remove all jobs, and replace with the jobs read from <filename>. If no file is specified, stdin will be used.

Note

root can use the option -u <username> to manage the jobs for another user. It is not recommended to use the crontab command to manage system jobs; instead, the methods described in the next section should be used.

Job format

When editing jobs with the crontab -e, an editor will be started (vi by default, unless the EDITOR environment variable has been set to something different). The file being edited will have one job per line. Empty lines are allowed, and comments start their line with a hash symbol (#). Environment variables can also be declared, using the format NAME=value, and will affect all lines below the line where they are declared. Common environment variables in a crontab include SHELL and MAILTO. Setting the SHELL variable will change which shell is used to execute the commands on the lines below it, while setting the MAILTO variable will change will email address output (if any) will be mailed to.

Important

Sending email may require additional configuration of the local mail server or SMTP relay on a system.

Individual jobs consist of six fields detailing when and what should be executed. When all five of the first fields match the current date and time, the command in the last field will be executed. These fields are (in order):

  • Minutes

  • Hours

  • Day-of-Month

  • Month

  • Day-of-Week

  • Command

Note

When the Day-of-Month and Day-of-Week fields are both other than *, the command will be executed when either of these two fields match. This can be used, for example, to run a command on the 15th of every month, and every Friday.

The first five of these fields all use the same syntax rules:

  • * for Don't Care/always

  • A number to specify a number of minutes or hours, a date, or a weekday. (For weekdays, 0 equals Sunday, 1 equals Monday, 2 equals Tuesday, etc. 7 also equals Sunday.)

  • x-y for a range, x to y inclusive

  • x,y for lists. Lists can include ranges as well, e.g., 5,10-13,17 in the Minutes column to indicate that a job should run at 5 minutes past the hour, 10 minutes past, 11 minutes past, 12 minutes past, 13 minutes past, and 17 minutes past.

  • */x to indicate an interval of x, e.g., */7 in the minutes column will run a job exactly every seven minutes.

Additionally, three-letter English abbreviations can be used for both month and weekdays, e.g., Jan, Feb and Tue, Wed.

The last field contains the command to be executed. This command will be executed by /bin/sh, unless a SHELL environment variable has been declared. If the command contains an unescaped percentage sign (%) that percentage sign will be treated as a newline, and everything after the percentage sign will be fed to the command on stdin.

Example cron jobs

Some example cron jobs:

  • 0 9 2 2 * /usr/local/bin/yearly_backup

    Execute the command /usr/local/bin/yearly_backup at exactly 9 a.m. on February 2nd, every year.

  • */7 9-16 * Jul 5 echo "Chime"

    Send an email containing the word Chime to the owner of this job, every seven minutes between 9 a.m. and 5 p.m., on every Friday in July.

  • 58 23 * * 1-5 /usr/local/bin/daily_report

    Run the command /usr/local/bin/daily_report every weekday at two minutes before midnight.

  • 0 9 * * 1-5 mutt -s "Checking in" boss@example.com % Hi there boss, just checking in.

    Every workday (Monday to Friday), at 9 a.m. sharp, send a mail message to boss@example.com using mutt.

References

crond(8), crontab(1), and crontab(5) man pages

Revision: rh134-7-63a207e