cronは、Unix系オペレーティングシステムのジョブ管理ツールである。cronジョブを予約すると、指定した日時または間隔でジョブを実行する。cronは、主にシステムの管理・維持を自動化する目的で使用されるが、一定の間隔でファイルや電子メールをインターネットからダウンロードするなどの用途にも応用できる。

cronは、反復的なタスクを予約するのに有用である。一度だけ実行するタスクの予約には、atコマンドを使用する。

名称は、「時間」を指すギリシア語の単語「chronos」に由来する。

## 概要

cronの動作は、crontab(cron table)ファイルで指定する。crontabは、一定のスケジュールで定期的に実行するシェルコマンドを指定する設定ファイルである。crontabファイルには、ジョブの一覧と、その他のcronデーモンへの指示が記録される。ユーザーは自分のcrontabを作成することができ、通常それとは別に、管理者のみが編集できるシステム全体のcrontabファイルが`/etc`またはそのサブディレクトリ(例: `/etc/cron.d`)に存在する。

各行は、次の形式でジョブを定義する。

各行は、コマンドを実行するタイミングを指定する5つの欄に続いて、実行するシェルコマンドを記入するという形式を取る。

通常、日時指定欄がすべて現在の日時と一致する場合にジョブが実行されるが、日(3つ目の欄)と曜日(5つ目の欄)の両方が指定されている(`*`ではない)場合、どちらかのみ一致する場合にもジョブが実行される。

例えば、以下は、cronのユーザーのデフォルトのシェルがBourne shellの場合に、Apacheのエラーログを毎日深夜から1分経過後に消去するジョブである。

また、以下は、export\_dump.shを毎週土曜日23時45分に実行するジョブである。

一部のシステムでは、`*/n`を指定して、n日・時間・分ごとにジョブを実行することができる。また、コンマを使って複数の時間間隔を指定することもできる(例: `1,2,3`)。例えば、以下の行は、1時から3時55分まで5分ごと(1時0分、1時5分、1時10分、...3時55分)にコマンドラインに「hello world」を出力する。

各ユーザーは、実際に設定ファイルが保存されている場所によらず、`crontab -e`を呼び出して自分の設定ファイルを編集できる。

多くのLinuxディストリビューションにインストールされているポール・ヴィクシーのBSD版cron実装は、ジョブを実行するアカウントのユーザー名を指定する6番目の欄を追加する。これは、システムのcrontabでのみ許可され、各ユーザーが単独で設定するよう割り当てられたその他のファイルでは使用できない。また、WindowsのnnCronデーモンなど、6番目の欄をアカウントのユーザー名ではなく年の指定に使うものもある。

Amazon EventBridgeのcron実装では、`0`を基底とせず、日曜日から土曜日まで`1`〜`7`で曜日を指定し、月の最初の平日や月末などを指定する追加の機能を持つ。

### 非標準のマクロ

一部のcron実装は、以下の非標準のマクロをサポートしている。

| マクロ | 説明 | 等価の表現 |
| --- | --- | --- |
| `@yearly`(`@annually`) | 毎年1月1日の0時0分に実行 | `0 0 1 1 *` |
| `@monthly` | 毎月1日の0時0分に実行 | `0 0 1 * *` |
| `@weekly` | 毎週日曜日の0時0分に実行 | `0 0 * * 0` |
| `@daily`(`@midnight`) | 毎日0時0分に実行 | `0 0 * * *` |
| `@hourly` | 毎時0分に実行 | `0 * * * *` |
| `@reboot` | 起動時に実行 | — |

`@reboot`を指定すると、デーモン起動時にジョブが1回実行される。cronは通常再起動されることがないため、これは通常マシンの起動時と一致する。Debian版のcronなど、一部の種類のcronはマシンの起動時にのみ実行するよう設計されており、デーモンの再起動時には`@reboot`のジョブが再実行されないようになっている。

`@reboot`は、特定のユーザーでサーバーやデーモンを起動する必要があり、ユーザーがプログラムを起動するようinitを設定する権限がない場合に有用である。

### cronのパーミッション

次の2つのファイルは重要な役割を担っている。

- /etc/cron.allow – このファイルが存在する場合、cronジョブを使用するにはユーザー名がこのファイルに含まれている必要がある。
- /etc/cron.deny – cron.arrowファイルが存在せず、cron.denyファイルが存在する場合、cronジョブを使用するにはユーザー名がcron.denyファイルに含まれていない必要がある。

どちらのファイルも存在しない場合、サイト固有の設定パラメーターにより、スーパーユーザーのみがcronジョブを使用できるか、すべてのユーザーがcronジョブを使用できるかが決定される。

### タイムゾーンの処理

多くのcron実装は、crontabの項目をcronデーモンが実行されているシステムのタイムゾーンの設定に基づいて解釈する。複数のユーザー向けの大規模なマシンで、ユーザーが地理的に複数のタイムゾーンに分散しているケースで、特にシステムのデフォルトのタイムゾーンが混乱を招くおそれのある夏時間を採用している場合、これは問題となる場合がある。このため、cron実装の中には、ユーザーのcrontabの`CRON_TZ=[タイムゾーン]`の形式を取る行を認識して、その行以降のcrontabの項目を指定されたタイムゾーンに基づいて解釈するものもある。

## 式

cronの式は、時間を指定するホワイトスペースで区切られた5つまたは6つの欄の文字列で、特定の作業を予約する。

コメントは`#`で始まる。

| 欄 | 必須 | 許容される値 | 許容される特殊文字 | 備考 |
| --- | --- | --- | --- | --- |
| 分 | Yes | 0〜59 | `*` `,` `-` |  |
| 時 | Yes | 0〜23 | `*` `,` `-` |  |
| 日 | Yes | 1〜31 | `*` `,` `-` `?` `L` `W` | `?` `L` `W`は一部の実装でのみ許容される。 |
| 月 | Yes | 1〜12 JAN〜DEC | `*` `,` `-` |  |
| 曜日 | Yes | 0〜6 SUN〜SAT | `*` `,` `-` `?` `L` `#` | `?` `L` `#` は一部の実装でのみ許容される。 |
| 年 | No | 1970〜2099 | `*` `,` `-` | この欄は標準・デフォルトの実装ではサポートされない。 |

月と曜日の省略記法は大文字・小文字が区別されない。

システムのcrontabファイル(/etc/crontab)には、コマンドを指定する欄の直前にユーザー名を指定する欄が存在する。この欄は通常`root`に設定される。

また、一部の実装では、行の最初に秒の指定欄が存在する場合もある。この場合、各行に6つまたは7つの欄が存在することになる。

### 非標準文字

以下は、Javaのジョブ管理ツールQuartzなど、一部のcron実装にのみ存在する非標準の文字である。