Cron 式ガイド:タスクスケジュールの生成とマスター方法
繰り返しのタスクを自動化することは、現代のソフトウェア開発とシステム管理の基礎です。データベースのバックアップ、日次レポートの送信、一時ファイルのクリーンアップなど、Cron は Unix 系オペレーティングシステムやクラウド環境でこれらのアクティビティをスケジュールするための業界標準です。
しかし、Cron 式の構文は難解で間違いやすいものです。このガイドでは、Cron 形式を分解し、特殊文字の仕組みを説明し、Cron 式生成器 を使用してワークフローを簡素化する方法を紹介します。
Cron 式とは?
Cron 式は、スケジュールを表す空白で区切られた 5 つまたは 6 つのフィールドで構成される文字列です。Cron デーモン(スケジュールされたタスクを実行するバックグラウンドサービス)に、コマンドを実行する正確なタイミングを伝えます。
標準形式(Crontab)の構造は次のとおりです。
* * * * *
| | | | |
| | | | +----- 曜日 (0 - 6) (日曜日から土曜日)
| | | +------- 月 (1 - 12)
| | +--------- 日 (1 - 31)
| +----------- 時 (0 - 23)
+------------- 分 (0 - 59)
AWS EventBridge や Quartz などの一部のシステムでは、6 番目や 7 番目のフィールド(秒や年)が追加されることがあります。
コア構文の解説
1. 分 (0 - 59)
タスクを実行する時間を分単位で指定します。0 は正時を意味します。
2. 時 (0 - 23)
タスクを実行する時間を時間単位で指定します。24 時間形式を使用します(例:午後 1 時の場合は 13)。
3. 日 (1 - 31)
タスクを実行する月の日を指定します。31 日未満の月には注意してください。
4. 月 (1 - 12 または JAN-DEC)
月を指定します。数字または 3 文字の略称を使用できます。
5. 曜日 (0 - 6 または SUN-SAT)
曜日を指定します。多くの実装では 0 と 7 の両方が日曜日を表すことに注意してください。
特殊文字:秘密のスパイス
複雑なスケジュールを作成するには、以下の記号を理解する必要があります。
- アスタリスク (*): ワイルドカード。そのフィールドの「すべての」値を意味します。分フィールドの
*は「毎分」を意味します。 - カンマ (,): 値のリストに使用します。分フィールドの
1,15,30は、1 分、15 分、30 分に実行することを意味します。 - ハイフン (-): 範囲を定義します。曜日フィールドの
1-5は月曜日から金曜日を意味します。 - スラッシュ (/): 増分を指定します。分フィールドの
*/15は「15 分おき」を意味します。 - クエスチョンマーク (?): Quartz や AWS などの一部のシステムで、もう一方のフィールドが指定されている場合に、日または曜日に「特定の値なし」として使用されます。
一般的な Cron の例
| スケジュール | 式 |
|---|---|
| 毎分 | * * * * * |
| 毎時 0 分 | 0 * * * * |
| 毎日深夜 0 時 | 0 0 * * * |
| 毎週月曜日午前 8 時 | 0 8 * * 1 |
| 15 分おき | */15 * * * * |
| 毎月 1 日の深夜 0 時 | 0 0 1 * * |
なぜオンライン Cron 生成器を使うのか?
経験豊富な開発者であっても、Cron 式を手動で書くとミスが発生し、バックアップの失敗やサーバーの過負荷につながる可能性があります。オンライン生成器には以下の利点があります。
- 即時フィードバック: 式の人間が読める説明(例:「日曜日の 04:05」)を確認できます。
- 視覚的な選択: 構文を推測するのではなく、UI から日付と時間を選択できます。
- バリデーション: 本番サーバーにデプロイする前に、式が有効であることを確認できます。
- 学習ツール: 式の変更が最終的なスケジュールにどのように影響するかを理解できます。
コード例:さまざまな環境での Cron の使用
Linux (Crontab)
cron ジョブを編集するには、次のコマンドを実行します。
crontab -e
次に、行を追加します。
0 2 * * * /usr/bin/backup-script.sh
Node.js (node-cron)
const cron = require('node-cron');
// 1 時間おきに実行
cron.schedule('0 * * * *', () => {
console.log('1 時間おきにタスクを実行中');
});
Python (APScheduler)
from apscheduler.schedulers.blocking import BlockingScheduler
def my_job():
print("ジョブを実行中...")
scheduler = BlockingScheduler()
scheduler.add_job(my_job, 'cron', hour=0, minute=0)
scheduler.start()
よくある質問 (FAQ)
*/5 * * * * と 5 * * * * の違いは何ですか?
*/5 * * * * は 5 分おき(0, 5, 10, ...)に実行されます。5 * * * * は 1 時間に 1 回、ちょうど 5 分に実行されます。
Cron はタイムゾーンをサポートしていますか?
デフォルトでは、Cron はシステムのローカル時間を使用します。多くのサーバーではこれは UTC です。一部の最新の Cron 実装ではタイムゾーンを指定できますが、サーバーの時間を使用すると想定するのが最も安全です。
「月の最終日」をどのように処理しますか?
標準の Crontab には特定の「L」文字はありません。通常、28 日から 31 日まで毎日スクリプトを実行し、「明日」が翌月の 1 日であるかどうかを確認する必要があります。ただし、Quartz のようなシステムは 0 0 L * * をサポートしています。
結論
タスクスケジューリングは、あらゆる技術専門家にとって不可欠なスキルです。Cron 式は最初は威圧的に見えるかもしれませんが、フィールド構造と特殊文字を理解すれば、自動化のための強力なツールになります。
独自のスケジュールを作成する準備はできましたか?当社の Cron 式生成器 を使用して、自信を持って次の cron ジョブを構築し、検証してください。