---
name: "crontab"
section: "5"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["linux", "freebsd", "openbsd", "macos"]
url: "https://new.carta.tech/crontab/5"
---

# crontab(5)

tables for driving cron

## NAME

**crontab** – tables for driving cron

## DESCRIPTION

A **crontab** file contains instructions to the [cron(8)](/cron/8.md) daemon of the general form: “at these times on these dates run this command”. There may be a system **crontab** and each user may have their own **crontab**. Commands in any given **crontab** will be executed either as the user who owns the **crontab** or, in the case of the system **crontab**, as the user specified on the command line.

While a **crontab** is a text file, it is not intended to be directly edited. Creation, modification, and removal of a **crontab** should be done using [crontab(1)](/crontab/1.md).

Blank lines, leading spaces, and tabs are ignored. Lines whose first non-space character is a pound sign (‘#’) are comments, and are ignored. Note that comments are not allowed on the same line as [cron(8)](/cron/8.md) 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** is either an environment variable setting or a [cron(8)](/cron/8.md) command.

Environment variable settings create the environment any command in the **crontab** is run in. An environment variable setting is of the form:

```
name = value
```

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.

Lines in the system **crontab** have six fixed fields, an optional flags field, and a command, in the form:

*minute* *hour* *day-of-month* *month* *day-of-week* *user* \[*flags*\] *command*

While lines in a user **crontab** have five fixed fields, an optional flags field, and a command, in the form:

*minute* *hour* *day-of-month* *month* *day-of-week* \[*flags*\] *command*

Fields are separated by blanks or tabs. The command may be one or more fields long. The allowed values for the fields are:

| | |
| --- | --- |
| **field** | **allowed** **values** |
| *minute* | \*, ~, or 0–59 |
| *hour* | \*, ~, or 0–23 |
| *day-of-month* | \*, ~, or 1–31 |
| *month* | \*, ~, 1–12, or a name (see below) |
| *day-of-week* | \*, ~, 0–7, or a name (0 or 7 is Sunday) |
| *user* | a valid username |
| \[*flags*\] | runtime flags, denoted with '-' |
| *command* | text |

Lists are allowed. A list is a set of numbers (or ranges) separated by commas. For example, “1,2,5,9” or “0–4,8–12”.

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

A random value for a field may be obtained using the ‘~’ character. A value is generated every time the tab is loaded. On its own, it denotes a random value appropriate for the field. It can also be used in a range to make the interval more specific. If either of the numbers in a range are omitted, the appropriate limit (low or high) for that field will be used. For example, both “0~30” and “~30” in the *minute* field would result in a random value between 0 and 30.

Step values can be used in conjunction with ranges. Following a range with /*number* specifies skips of *number* through the range. For example, “0–23/2” can be used in the *hour* field to specify command execution every other hour. Steps are also permitted after an asterisk, so to say “every two hours”, just use “\*/2”. A step value after a random range will execute the command at a random offset less than the step size. For example, to avoid a thundering herd at the top and bottom of the hour, “0~59/30”( or simply “~/30”) can be used in the *minute* field to specify that command execution happen twice an hour at consistent intervals.

An asterisk (‘\*’) is short form for a range of all allowed values.

Names can be used in 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.

Some *flags* relating to process operation can be provided before the *command* field. Flags are denoted with '-' and may be combined.

- **-n** *command*

  No mail is sent after a successful run. The execution output will only be mailed if the command exits with a non-zero exit code. The **-n** option is an attempt to cure potentially copious volumes of mail coming from [cron(8)](/cron/8.md).

- **-q** *command*

  Execution will not be logged.

- **-s** *command*

  Only a single instance of *command* will be run concurrently. Additional instances of *command* will not be scheduled until the earlier one completes.

The *command* field (the rest of the line) is 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 **crontab**. Percent signs (‘%’) in the command, unless escaped with a backslash (‘\\’), will be changed into newline characters, and all data after the first ‘%’ will be sent to the command as standard input.

Commands are executed by [cron(8)](/cron/8.md) when the *minute*, *hour*, and *month* fields match the current time, *and* when at least one of the two day fields (*day-of-month* or *day-of-week*), match the current time.

Note: 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 (i.e. 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.

Instead of the first five fields, one of eight special strings may appear:

| | |
| --- | --- |
| **string** | **meaning** |
| @reboot | Run once, at startup. |
| @yearly | Run every January 1 (0 0 1 1 \*). |
| @annually | The same as @yearly. |
| @monthly | Run the first day of every month (0 0 1 \* \*). |
| @weekly | Run every Sunday (0 0 \* \* 0). |
| @daily | Run every midnight (0 0 \* \* \*). |
| @midnight | The same as @daily. |
| @hourly | Run every hour, on the hour (0 \* \* \* \*). |

## ENVIRONMENT

- HOME

  Set from the user's */etc/passwd* entry. May be overridden by settings in the **crontab**.

- LOGNAME

  Set from the user's */etc/passwd* entry. May not be overridden by settings in the **crontab**.

- MAILTO

  If MAILTO is defined and non-empty, mail is sent to the user so named. If MAILTO is defined but empty (MAILTO = ""), no mail will be sent. Otherwise mail is sent to the owner of the **crontab**. This is useful for pseudo-users that lack an alias that would otherwise redirect the mail to a real person.

- SHELL

  Set to */bin/sh*. May be overridden by settings in the **crontab**.

- USER

  Set from the user's */etc/passwd* entry. May not be overridden by settings in the **crontab**.

## FILES

- */etc/crontab*

  System crontab.

- */var/cron/tabs/*⟨*user*⟩

  User crontab.

## EXAMPLES

```
# 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 -- job output will be sent
# to paul, but only if $HOME/bin/monthly exits with a non-zero exit code
15 14 1 * *     -n $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"
# run hourly at a random time within the first 30 minutes of the hour
0~30 * * * *   /usr/libexec/spamd-setup
```

## SEE ALSO

[crontab(1)](/crontab/1.md), [cron(8)](/cron/8.md)

## STANDARDS

The **crontab** file format is compliant with the IEEE Std 1003.1-2008 (“POSIX.1”) specification. The behaviours described below are all extensions to that standard:

- The *day-of-week* field may use 7 to represent Sunday.

- Ranges may include “steps”.

- Random intervals are supported using the ‘~’ character.

- Months or days of the week can be specified by name.

- Environment variables can be set in a crontab.

- Command output can be mailed to a person other than the crontab owner, or the feature can be turned off and no mail will be sent at all.

- All of the ‘@’ commands that can appear in place of the first five fields.

- All of the \[**-nqs**\] flags.

## AUTHORS

**crontab** was written by Paul Vixie ⟨*vixie@isc.org*⟩.
