cronの書き方入門|5つのフィールドと記号・crontab設定例をやさしく解説
cron(クーロン)は、決まった時刻に処理を自動実行するための定番の仕組みです。本記事では、cronとは何かから、書式を構成する5つのフィールドの意味、* / , - といった記号の使い方、毎日・毎時・毎週などよく使う設定例、そして設定時に陥りやすい注意点までを、初心者向けに順を追って解説します。
「毎晩バックアップを取りたい」「1時間ごとにログを集計したい」——こうした定期実行を人手でやるのは現実的ではありません。LinuxやmacOSで定番の自動実行の仕組みがcron(クーロン)です。最初は数字と記号の羅列に見えますが、書式はたった5つのフィールドの組み合わせにすぎません。本記事では、はじめて触れる方に向けて、cronの書き方を一歩ずつ解説します。
cronとは何か
cronとは、UNIX系OS(Linux、macOSなど)に備わっている定期実行のためのスケジューラです。バックグラウンドで動くcrondというプログラムが、登録された予定を1分ごとに確認し、時刻が一致したコマンドを自動的に実行します。
実行スケジュールを書き並べた設定ファイルをcrontab(cron table、クーロンタブ)と呼びます。ユーザーは crontab -e というコマンドで自分専用のcrontabを編集し、crontab -l で内容を確認できます。1行が1つの予定に対応し、次のような形をしています。
* * * * * 実行したいコマンド
行頭に並ぶ5つの * が「いつ実行するか」を表すスケジュール部分で、その後ろに実際のコマンドを書きます。この5つの欄をどう書くかが、cronを使いこなす要点です。
cronが活躍する場面は幅広く、次のような定期作業に向いています。
- バックアップ:毎晩データベースやファイルを退避する。
- 集計・レポート:1時間ごと、あるいは毎朝にログを集計する。
- メンテナンス:一時ファイルの削除やキャッシュのクリアを定期実行する。
- 通知:定刻にメールやチャットへリマインドを送る。
5つのフィールドの意味
スケジュール部分は、左から順に分・時・日・月・曜日の5つのフィールドで構成されます。それぞれが指定できる範囲は次のとおりです。
| 位置 | フィールド | 指定できる範囲 |
|---|---|---|
| 1番目 | 分 | 0〜59 |
| 2番目 | 時 | 0〜23(24時間制) |
| 3番目 | 日 | 1〜31 |
| 4番目 | 月 | 1〜12 |
| 5番目 | 曜日 | 0〜7(0と7が日曜、1が月曜) |
たとえば 30 9 * * * なら、分=30、時=9、残りはすべて指定なしなので、毎日9時30分に実行という意味になります。読み方のコツは、左から「何分・何時・何日・何月・何曜日」と順に当てはめることです。
時刻は24時間制で、午後3時は 15 と書きます。曜日は数字で指定し、0または7が日曜、1が月曜、…6が土曜です。環境によっては sun や mon のような英語3文字、月に jan や feb も使えますが、互換性を重視するなら数字が無難です。
0 0 1 * * → 分=0、時=0、日=1、つまり毎月1日の0時0分に実行
なお日と曜日の両方を指定した場合は、多くのcronで「どちらか一方に一致すれば実行」というOR条件になります。直感に反しやすい点なので後述の注意点で改めて触れます。
記号(* / , -)の使い方
各フィールドには数字だけでなく、繰り返しや範囲を表す記号を組み合わせられます。覚えるべき記号は次の4つです。
| 記号 | 意味 | 例 |
|---|---|---|
| * | すべての値(毎回) | 時の欄で * は毎時 |
| / | 間隔(〜ごと) | */5 は5分ごと |
| , | 複数指定(列挙) | 0,30 は0分と30分 |
| - | 範囲 | 9-17 は9時から17時 |
アスタリスク(*)は「その欄については条件を付けない=毎回」という意味です。5つすべてを * にした * * * * * は、1分ごとに実行という最短間隔になります。
スラッシュ(/)は「○○ごと」という間隔を表します。分の欄の */15 は0分・15分・30分・45分、つまり15分間隔という意味です。*/2 を時の欄に書けば2時間ごとになります。
カンマ(,)は値を列挙します。0,15,30,45 は */15 と同じ結果ですが、不規則な時刻(例:8,12,18)を指定したいときに便利です。
ハイフン(-)は連続した範囲を表します。曜日の欄の 1-5 は月曜から金曜(平日)を意味します。これらは組み合わせも可能で、0-30/10 なら「0分から30分の間で10分ごと(0,10,20,30)」となります。
よく使う設定例
ここまでの部品を組み合わせると、実用的なスケジュールが書けます。代表的な例を見てみましょう。コマンド部分は command と省略しています。
| 書き方 | 意味 |
|---|---|
| * * * * * command | 毎分(1分ごと) |
| */5 * * * * command | 5分ごと |
| 0 * * * * command | 毎時0分(1時間ごと) |
| 0 9 * * * command | 毎日9時0分 |
| 30 2 * * * command | 毎日深夜2時30分(バックアップ向き) |
| 0 9 * * 1 command | 毎週月曜9時 |
| 0 9 * * 1-5 command | 平日(月〜金)の9時 |
| 0 0 1 * * command | 毎月1日の0時 |
| 0 0 1 1 * command | 毎年1月1日の0時 |
ポイントは、左のフィールドほど細かい単位だということです。「毎時」なら分だけ固定して時以降を * に、「毎日」なら分と時を固定して日以降を * に、「毎週」ならさらに曜日を指定する、という具合に、固定する欄を右へ広げていくと目的の周期に近づきます。
こうした書式は、頭の中だけで正しさを判断するのが難しいものです。cron式ジェネレーターを使えば、画面上で周期を選ぶだけで正しいcron式を生成でき、逆に式を入力して「次にいつ実行されるか」を確認することもできます。試行錯誤しながら設定を詰められるので、書き間違いを防ぐのに役立ちます。すべてブラウザ内で動くため、入力した内容が外部に送信される心配もありません。
設定時の注意点
cronは強力ですが、つまずきやすい落とし穴がいくつかあります。最後に代表的な注意点をまとめます。
- 環境変数(特にPATH)が限定される:cronはログインシェルとは異なる最小限の環境で動くため、コマンドが見つからないことがあります。/usr/bin/python3 のように絶対パスで書くか、スクリプト内でPATHを設定すると安全です。
- 日と曜日の同時指定はOR条件:たとえば 0 0 1 * 1 は「毎月1日」と「毎週月曜」のどちらかに一致すれば実行される点に注意してください。意図と違う動きになりやすい部分です。
- タイムゾーンを確認する:サーバーの時刻設定(UTCか日本時間か)によって実行時刻がずれます。想定とずれる場合はまずタイムゾーンを疑いましょう。
- 出力とエラーは捨てられがち:標準出力やエラーは放置するとメールに溜まるか失われます。>> /path/to/log 2>&1 のようにログへ追記しておくと、後から原因を追えます。
- 処理の重複に注意:前回の実行が終わる前に次が始まると多重起動になります。長時間かかる処理ではロックファイルなどで重複を防ぐ工夫が必要です。
cronは、覚える部品は5つのフィールドと4つの記号だけなのに、応用範囲が非常に広い仕組みです。まずは目的の周期をcron式ジェネレーターで組み立て、生成された式と次回実行時刻を確認しながら、少しずつ自分の運用に合わせて育てていきましょう。
本記事は一般的な情報であり、cronの挙動は利用するOSやディストリビューション、cronの実装によって細部が異なります。正確な仕様は各環境の公式ドキュメント(manページなど)を確認してください。
よくある質問
cron(crontab)とは何ですか?
cronはLinuxやmacOSに備わっている定期実行のためのスケジューラです。バックグラウンドで動くプログラムが登録された予定を1分ごとに確認し、時刻が一致したコマンドを自動実行します。予定を書き並べた設定ファイルをcrontabと呼び、crontab -e で編集します。バックアップや集計などの定期作業に使われます。
cronの5つのフィールドは何を表していますか?
左から順に「分(0〜59)・時(0〜23)・日(1〜31)・月(1〜12)・曜日(0〜7、0と7が日曜)」を表します。たとえば 30 9 * * * は分=30、時=9で、それ以外は指定なしなので毎日9時30分の実行という意味になります。
「毎日」「毎時」「毎週」はどう書きますか?
毎時は 0 * * * *(毎時0分)、毎日は 0 9 * * *(毎日9時)、毎週は 0 9 * * 1(毎週月曜9時)のように書きます。固定したい欄に数字を入れ、それより右の欄を * にすると目的の周期になります。5分ごとなら */5 * * * * のようにスラッシュで間隔を指定します。
* / , - の記号はどう使い分けますか?
* はすべての値(毎回)、/ は間隔(*/5 で5分ごと)、, は複数指定(0,30 で0分と30分)、- は範囲(1-5 で月〜金)を表します。組み合わせも可能で、たとえば 0-30/10 は0分から30分まで10分ごとを意味します。
cron式ジェネレーターに入力した内容は送信されますか?
WAZA TOOLSのcron式ジェネレーターはすべてブラウザ内で処理され、入力したスケジュールやコマンドがサーバーに送信・保存されることはありません。安心してご利用いただけます。