Cronジョブ式チートシート — プロのようにスケジューリング
CronはUnix系システムにおけるスケジュールタスク自動化の基盤です。ログのローテーション、データベースのバックアップ実行、CI/CDパイプラインのトリガーなど、cron式はそれらのジョブがいつ実行されるかを定義します。構文はコンパクトですが強力で、当て推量では間違えやすいものです。
このリファレンスでは、cron構文のすべての要素を実践的なコピー&ペースト可能な例と共に解説します。インタラクティブに式を構築・検証したい場合は、このガイドと一緒にCron式ビルダーを開いてください。
Cron構文:5つのフィールド
標準的なcron式は、スペースで区切られた5つのフィールドで構成されます:
┌───────────── 分 (0–59)
│ ┌───────────── 時 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12)
│ │ │ │ ┌───────────── 曜日 (0–7、0と7は日曜日)
│ │ │ │ │
* * * * *
各フィールドは特定の値、範囲、リスト、またはワイルドカードを受け入れます。5つのフィールドが合わさって、正確な繰り返しスケジュールを指定します。
| フィールド | 許容値 | 特殊文字 |
|---|---|---|
| 分 | 0–59 | * , - / |
| 時 | 0–23 | * , - / |
| 日 | 1–31 | * , - / |
| 月 | 1–12 | * , - / |
| 曜日 | 0–7 | * , - / |
月と曜日のフィールドは、ほとんどの実装で3文字の略語(JAN–DEC、SUN–SAT)も受け入れます。
特殊文字の解説
4つの特殊文字を理解すれば、cronの全機能を引き出せます:
アスタリスク * — 「すべて」
そのフィールドのすべての可能な値に一致します。
* * * * * # 毎日、毎時、毎分実行
カンマ , — 「および」
離散値のリストを指定します。
0 9,12,18 * * * # 毎日9:00、12:00、18:00に実行
ハイフン - — 「から…まで」
包括的な範囲を定義します。
0 9-17 * * * # 9時から17時まで毎時実行
スラッシュ / — 「n番目ごと」
範囲の先頭からのステップ間隔を設定します。
*/10 * * * * # 10分ごと(0, 10, 20, 30, 40, 50)
範囲とステップを組み合わせることもできます:
0 9-17/2 * * * # 9時から17時まで2時間ごと(9, 11, 13, 15, 17)
よく使うCronスケジュール例
このテーブルをブックマークしてください。繰り返し使うスケジュールです。
| スケジュール | 式 | 説明 |
|---|---|---|
| 毎分 | * * * * * | 毎分の冒頭に実行 |
| 5分ごと | */5 * * * * | 0, 5, 10, 15, …, 55分 |
| 15分ごと | */15 * * * * | 0, 15, 30, 45分 |
| 毎時 | 0 * * * * | 毎時0分に実行 |
| 6時間ごと | 0 */6 * * * | 00:00, 06:00, 12:00, 18:00 |
| 毎日深夜0時 | 0 0 * * * | 1日1回、00:00に実行 |
| 毎日午前3時 | 0 3 * * * | 1日1回、03:00に実行 |
| 毎週月曜9時 | 0 9 * * 1 | 毎週月曜日09:00に実行 |
| 平日毎朝8時 | 0 8 * * 1-5 | 月曜日から金曜日の08:00 |
| 週末正午 | 0 12 * * 0,6 | 土曜日と日曜日の12:00 |
| 毎月1日 | 0 0 1 * * | 毎月1日の深夜0時 |
| 四半期ごと(1,4,7,10月) | 0 0 1 1,4,7,10 * | 四半期月の1日深夜0時 |
| 営業時間中15分ごと | */15 9-17 * * 1-5 | 平日9時〜17時、15分ごと |
任意の式をCron式ビルダーに貼り付けて、次の実行時刻を視覚化できます。
高度なパターン
リストと範囲の組み合わせ
フィールドは混合構文を受け入れます。平日の8時と18時にジョブを実行するには:
0 8,18 * * 1-5
ステップで特定の月を指定するには:
0 0 1 1-12/3 * # 1月から3ヶ月ごと(1月, 4月, 7月, 10月)
日と曜日の関係
日と曜日の両方が設定されている場合(*ではない場合)、動作は実装によって異なります。標準cronでは、いずれかの条件が満たされた場合にジョブが実行されます。ANDではなくORの関係です。これは多くの人を驚かせます。
0 0 15 * 1 # 15日と毎週月曜日に実行 — 「15日の月曜日」ではない
起動時の実行
cron式そのものではありませんが、@rebootは広くサポートされているショートカットです:
@reboot /usr/local/bin/start-service.sh
その他の一般的なショートカット:
| ショートカット | 同等の式 |
|---|---|
@yearly | 0 0 1 1 * |
@monthly | 0 0 1 * * |
@weekly | 0 0 * * 0 |
@daily | 0 0 * * * |
@hourly | 0 * * * * |
異なる環境でのCron
5フィールド構文は普遍的ですが、cronの設定方法はプラットフォームによって異なります。
Linux Crontab
定番です。crontab -eでユーザーcrontabを編集します:
# 毎日午前2時にバックアップを実行
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
/etc/cron.d/のシステム全体のcronジョブには、ユーザーフィールドが追加されます:
0 2 * * * root /usr/local/bin/cleanup.sh
GitHub Actions
GitHub Actionsはscheduleトリガー内で同じ5フィールド構文を使用します。すべての時刻はUTCです。
on:
schedule:
- cron: '0 3 * * 1-5' # 平日UTC3時
YAML設定の詳細については、Kubernetes向けYAMLとDocker Compose向けYAMLを参照してください。
Kubernetes CronJob
KubernetesはCron式をCronJobリソースでラップします:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: reporting:latest
command: ["python", "generate_report.py"]
restartPolicy: OnFailure
KubernetesはデフォルトでUTCを使用します。v1.25以降、CronJobスペックでtimeZone: "America/New_York"を設定できます。
AWS CloudWatch (EventBridge)
AWSは6フィールド(秒を追加)とrate() / cron()ラッパーを使用する、やや異なる構文を使います:
cron(0 3 * * ? *) # 毎日UTC3時
?文字に注意 — AWSでは、一方が指定されている場合、日または曜日のいずれかに?が必要です。これは標準cronとは異なります。
よくある落とし穴
1. タイムゾーンの混乱
CronはLinuxではシステムのタイムゾーンをデフォルトで使用しますが、KubernetesとGitHub ActionsはUTCで動作します。0 9 * * *でスケジュールされたジョブはUTC9時に起動し、日本時間では18時になります。
スケジューラーがどのタイムゾーンを使用するか必ず確認してください。タイムスタンプ変換については、Unixタイムスタンプ解説ガイドがUTCオフセットを詳しく説明しています。
2. 実行の重複
ジョブが実行間隔よりも長くかかる場合、重複したインスタンスが発生します。*/5 * * * *スケジュールで8分かかるスクリプトは積み上がります。
解決策:
- ロックファイルを使用する(Linuxの
flock) - KubernetesのCronJobで
concurrencyPolicy: Forbidを設定する - スクリプトの先頭で実行中のインスタンスを確認する
3. 出力の欠落とデバッグ
Cronはデフォルトではstdoutをキャプチャしません。常に出力をリダイレクトしてください:
*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
cronジョブが実行されない場合、確認事項:
grep CRON /var/log/syslogで実行ログを確認- スクリプトのファイルパーミッション
PATH環境変数 — cronはデフォルトで最小限のPATHを持つ
4. 「毎月31日」の罠
0 0 31 * * # 31日がある月のみ実行
これは1月、3月、5月、7月、8月、10月、12月に実行されますが、残りの5ヶ月は静かにスキップされます。月末ジョブが必要な場合は、1日に実行してスクリプトロジックを調整するか、「月の最終日」セマンティクスをサポートするツールを使用することを検討してください。
5. Crontabの末尾の改行を忘れる
一部のcron実装では、crontabファイルの末尾に改行が必要です。最後のエントリが実行されない場合は、末尾に空行を追加してください。
視覚的に式を構築する
構文の暗記は一般的なパターンには有効ですが、複雑なスケジュールは視覚的に構築する方が簡単です。alltools.oneのCron式ビルダーでは:
- ドロップダウンで各フィールドの値を選択
- スケジュールの人間が読める説明を表示
- 今後の実行時刻をプレビュー
- ワンクリックで最終式をコピー
完全にブラウザ内で動作し、データはサーバーに送信されません。
クイックリファレンスカード
このブロックをプロジェクトドキュメントやチームWikiにコピーしてください:
# ┌───── 分 (0-59)
# │ ┌───── 時 (0-23)
# │ │ ┌───── 日 (1-31)
# │ │ │ ┌───── 月 (1-12)
# │ │ │ │ ┌───── 曜日 (0-7, 日=0または7)
# │ │ │ │ │
# * * * * *
*/5 * * * * # 5分ごと
0 * * * * # 毎時
0 0 * * * # 毎日深夜0時
0 9 * * 1-5 # 平日9時
0 0 1 * * # 毎月1日
*/15 9-17 * * 1-5 # 営業時間中15分ごと
さらに読む
- Unixタイムスタンプ解説 — エポック時間とタイムゾーン変換を理解する
- Kubernetes向けYAML — CronJobやその他のKubernetesリソースを設定する
- Docker Compose向けYAML — Compose設定でコンテナをスケジュールする
次のcron式を構築する準備はできましたか?**Cron式ビルダー**を開いて、最初から正しくスケジュールを設定しましょう。