cronとは
cronは、
Unix系
オペレーティングシステムで利用されるジョブ管理ツールです。このツールを使うことで、特定のコマンドやシェルスクリプトを、あらかじめ設定した日時や間隔で自動的に実行できます。cronはシステムの管理やメンテナンスを自動化する目的でよく使われますが、例えば、
インターネットから定期的にファイルをダウンロードしたり、メールをチェックしたりといった用途にも応用可能です。
cronの動作
cronの設定は「crontab」という設定ファイルで行います。crontabには、定期的に実行したいコマンドとその実行スケジュールが記述されます。ユーザーは個別のcrontabを持つことができ、システム全体の設定は通常、管理者のみが編集できる別の場所に保存されます。
crontabの記述形式
crontabの各行は、実行スケジュールとコマンドを定義します。基本的な形式は以下の通りです。
┌───────────── 分(0〜59)
│ ┌───────────── 時(0〜23)
│ │ ┌───────────── 日(1〜31)
│ │ │ ┌───────────── 月(1〜12)
│ │ │ │ ┌───────────── 曜日(0〜6〈日〜土〉、一部のシステムでは7も日曜日)
│ │ │ │ │
│ │ │ │ │
[実行するコマンド]
各フィールドは、それぞれ「分」「時」「日」「月」「曜日」を表し、アスタリスク()は「すべての値」を意味します。例えば、「
command」と記述すると、毎分commandが実行されます。
具体例
- - 毎日午前1時1分にApacheのエラーログを消去する場合:`1 1
command`
- 毎週土曜日の23時45分にexport_dump.shを実行する場合:`45 23 6 /path/to/export_dump.sh`
また、特定の間隔で実行したい場合は、`
/n`という形式で指定できます。例えば、`/5`は「5分ごと」を意味します。また、`1,2,3`のようにコンマを使って複数の値を指定することも可能です。例えば、`0,5,10,15,20,25,30,35,40,45,50,55 1,2,3
echo hello world` は、午前1時から3時55分まで5分ごとに"hello world"を出力します。
その他の機能
- - 一部のcron実装では、ジョブを実行するユーザー名を指定する6番目の欄を追加できます。これは、システム全体のcrontabでのみ許可されています。
- - Amazon EventBridgeのcron実装では、曜日を1〜7で指定し、月の最初の平日や月末などを指定する追加機能があります。
非標準マクロ
- - `@reboot`: システム起動時に一度だけジョブを実行します。これは、サーバーやデーモンを特定のユーザーで起動したい場合に便利です。
cronのパーミッション
cronの利用許可は、以下のファイルで制御されます。
- - `/etc/cron.allow`: このファイルが存在する場合、cronジョブを実行できるユーザーがリストされています。
- - `/etc/cron.deny`: `/etc/cron.allow`が存在しない場合、このファイルにリストされているユーザーはcronジョブを実行できません。
両方のファイルが存在しない場合は、システムの設定により、rootユーザーのみが使用できるか、すべてのユーザーが利用可能かが決まります。
タイムゾーンの処理
多くのcron実装は、システムの設定に基づいたタイムゾーンでcrontabの項目を解釈します。ユーザーが異なるタイムゾーンに分散している大規模なシステムでは、混乱を避けるために、crontab内でタイムゾーンを指定できます。`CRON_TZ=[タイムゾーン]`の形式で指定することで、その行以降のcrontabの項目は指定されたタイムゾーンで解釈されます。
cronの式
cronの式は、実行スケジュールを定義する文字列で、スペースで区切られた5つまたは6つのフィールドから構成されます。
`: アスタリスクは「すべて」を意味し、例えば`
`は「毎分」を表します。- `,`: コンマは複数の値を指定するために使用されます。例えば、`MON,WED,FRI`は「月曜日、水曜日、金曜日」を意味します。- `-`: ハイフンは範囲を指定するために使用されます。例えば、`2000-2010`は「2000年から2010年」を表します。- `%`: コマンド内のパーセント記号は改行文字に変換され、以降のデータが標準入力としてコマンドに渡されます。
非標準文字
一部のcron実装では、以下のような非標準文字がサポートされています。
- - `L`: 「最後」を意味し、曜日欄では「最後の金曜日」のように使用され、日欄では「月末」を意味します。
- - `W`: 指定された日に最も近い平日を指します。
- - `#`: 曜日欄で使用し、月の「第n曜日」を指定します。
- - `?`: 一部の実装では、月や曜日欄を空欄にする際に使用します。他の実装では、デーモン起動時の時間に置き換えられます。
- - `/`: Vixie Cronでは、範囲と組み合わせて刻み値を指定するために使用されます。例えば、`
/5`は「5分ごと」を意味します。
- `H`: Jenkinsで利用可能で、ジョブを1時間に1回、分散された時間に実行できます。
関連項目
- - anacron: cronが利用できない環境で、システムがオフラインだった場合でも、ジョブを後で実行するためのツール
- - launchd: macOSで利用できるタスクスケジューラー
- - systemd: Linuxで利用できるシステムおよびサービスマネージャー
- - Windows Task Scheduler: Windows OSで利用できるタスクスケジューラー
cronは、タスクの自動化に不可欠なツールです。その仕組みを理解することで、より効率的なシステム運用が可能になります。