Linux and Unix crontab command

Quick links

About crontab
Syntax
Examples
Related commands
Linux and Unix main page

About crontab

The crontab is a list of commands that you want to run on a regular schedule, and also the name of the command used to manage that list.

crontab stands for "cron table," because it uses the job scheduler cron to execute tasks; cron itself is named after "chronos," the Greek word for time.

Syntax

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

Description

crontab is the program used to edit, remove or list the tables used to drive the cron daemon. Each user can have their own crontab. Although these files are located in /var/spool/, they are not intended to be edited directly, and that's where the crontab command comes in.

cron jobs can be allowed or disallowed for individual users, as specified in the cron.allow and cron.deny files. If the cron.allow file exists, a user must be listed there in order to be allowed to use a given command. If the cron.allow file does not exist but the cron.deny file does exist, then a user must not be listed there in order to use a given command. If neither of these files exists, only the super user will be allowed to use a given command. Another option is using PAM authentication to set up users who may or may not use crontab and system cron jobs, as configured in /etc/cron.d/.

The temporary directory for cron jobs can be set in environment variables; if not, /tmp is used as the temporary directory.

Options

-u Append the name of the user whose crontab is to be tweaked. If this option is not given, crontab examines "your" crontab, i.e., the crontab of the person executing the command. Note that su can confuse crontab and that if you are running it inside of su you should always use the -u option for safety's sake. The first form of this command is used to install a new crontab from some named file, or from standard input if the filename is given as "-".
-l Display the current crontab.
-r Remove the current crontab.
-e Edit the current crontab, using the editor specified in the VISUAL or EDITOR environment variables.
-i Same as -r, but gives the user a "Y/n" prompt before actually removing the crontab.
-s SELinux only: appends the current SELinux security context string as an MLS_LEVEL setting to the crontab file before editing or replacement occurs. See your SELinux documentation for details.

More About crontab Files

Blank lines and leading spaces and tabs are ignored. Lines whose first non-space character is a pound-sign (#) are interpreted as comments, and are ignored. Note that comments are not allowed on the same line as cron commands, since they will be taken to be part of the command. Similarly, comments are not allowed on the same line as environment variable settings.

An active line in a crontab will be either an environment setting or a cron command. An environment setting is of the form

name = value 

where the spaces around the equal sign (=) are optional, and any subsequent non-leading spaces in value will be part of the value assigned to name. The value string may be placed in quotes (single or double, but matching) to preserve leading or trailing blanks.

Several environment variables are set up automatically by the cron daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner. HOME and SHELL may be overridden by settings in the crontab; LOGNAME may not.

(Another note: the LOGNAME variable is sometimes called USER on BSD systems. On these systems, USER will be set also.)

In addition to LOGNAME, HOME, and SHELL, cron will look at MAILTO if it has any reason to send mail as a result of running commands in "this" crontab. If MAILTO is defined (and non-empty), mail is sent to the named user. If MAILTO is defined but empty ('MAILTO=""'), no mail will be sent. Otherwise mail is sent to the owner of the crontab. This option is useful if you decide on /bin/mail instead of /usr/lib/sendmail as your mailer when you install cron, because /bin/mail doesn't do aliasing.

By default, cron will send mail using the 'Content-Type:' header 'text/plain' with the 'charset=' parameter set to the charmap / codeset of the locale in which crond is started up: either the default system locale (if no LC_* environment variables are set) or the locale specified by the LC_* environment variables. You can use different character encodings for mailed cron job output by setting the CONTENT_TYPE and CONTENT_TRANSFER_ENCODING variables in crontabs.

The MLS_LEVEL environment variable provides support for multiple per-job SELinux security contexts in the same crontab. By default, cron jobs execute with the default SELinux security context of the user that created the crontab file. When using multiple security levels and roles, this may not be sufficient, because the same user may be running in a different role or at a different security level. You can set MLS_LEVEL to the SELinux security context string specifying the SELinux security context in which you want the job to run, and crond will set the execution context of the or jobs to which the setting applies to the specified context. (See the description of crontab -s in the options section.)

cron Command Format

Each cron command in the crontab file has five time and date fields, followed by a user name if it is the system crontab file, followed by a command. Commands are executed by cron when the minute, hour, and month of year fields match the current time, and at least one of the two day fields (day of month, or day of week) match the current time. Note that this means that nonexistent times, such as "missing hours" during daylight savings conversion, will never match, causing jobs scheduled during the "missing times" not to be run. Similarly, times that occur more than once during daylight savings will cause matching jobs to be run twice.

cron examines crontab entries once every minute.

The time and date fields are:

field allowed values
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names; see example below)
day of week 0-7 (0 or 7 is Sun, or use names; see below)

A field may be an asterisk (*), which always stands for "first through last".

Ranges of numbers are allowed. Ranges are two numbers separated with a hyphen. The specified range is inclusive; for example, 8-11 for an "hours" entry specifies execution at hours 8, 9, 10 and 11.

Lists are allowed. A list is a set of numbers (or ranges) separated by commas. Examples: "1,2,5,9", "0-4,8-12".

Step values can be used in conjunction with ranges. For example, "0-23/2" can be used in the hours field to specify command execution every other hour. Steps are also permitted after an asterisk, so if you want to say "every two hours", you can use "*/2".

Names can also be used for the "month" and "day of week" fields. Use the first three letters of the particular day or month (case doesn't matter). Ranges or lists of names are not allowed.

The "sixth" field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile. Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

Note that the day of a command's execution can be specified by two fields: day of month, and day of week. If both fields are restricted (in other words, they aren't *), the command will be run when either field matches the current time. For example, "30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.

Files

/etc/cron.allow
/etc/cron.deny

Example crontab Command

crontab -e

Allows you to edit the crontab file. The following is an example crontab file, with comments:

Example crontab File

# use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to 'paul', no matter whose crontab this is
MAILTO=paul
# run five minutes after midnight, every day
5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 2:15pm on the first of every month -- output mailed to paul
15 14 1 * *     $HOME/bin/monthly
# run at 10 pm on weekdays, annoy Joe
0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
5 4 * * sun     echo "run at 5 after 4 every sunday"

Related commands

at