計算ツール
ITスケジュールDevOps現場実務

Cron式 計算ツール|次回実行時刻と書式解説・AWS/GitHub Actions/K8s対応

Cron式から次回実行時刻と意味を即算出する無料電卓。「分 時 日 月 曜日」の5フィールド書式、AWS EventBridge/GitHub Actions/Kubernetes CronJob対応記法、UTC/JSTタイムゾーン運用、systemd timerとの使い分け、実務のハマりどころまで整理。POSIX crontab(5)・大手クラウドの公式ドキュメントに基づき、ジョブスケジューラ設計を支援します。

最終更新:2026-07-28/監修:計算ツールズ編集部

Cron式ツール

Cron式の5フィールド書式

基本書式

分 時 日 月 曜日 [コマンド]

CronはUnix系の定時実行スケジューラで、1975年のVersion 7 UNIX(AT&T Bell Labs)に起源を持ちます。5フィールドで実行タイミングを記述し、記法はPOSIX標準として広く受け入れられています。AWS Lambda(EventBridge Scheduler)、GitHub Actions、Kubernetes CronJob、GCP Cloud Scheduler、Azure Functionsなど、現代のクラウドスケジューラでも基本記法として採用されています。

各フィールドの範囲

フィールド値の範囲特殊記号
分(minute)0-59* / , -
時(hour)0-23* / , -
日(day of month)1-31* / , - ? L W
月(month)1-12 または JAN-DEC* / , -
曜日(day of week)0-7 または SUN-SAT(0/7=日)* / , - ? L #

秒フィールドの拡張

AWS EventBridge、Quartz Scheduler、Spring Framework等では先頭に「秒」フィールドを追加した6フィールド記法を採用しています。「秒 分 時 日 月 曜日」で1秒精度の実行が可能。GitHub ActionsやGCP Cloud Scheduler、Vixie cronは伝統的な5フィールドのみ。プラットフォーム間で移植する際は要注意です。

特殊記号(* / , - ? L W #)

* (アスタリスク)─ 任意の値

* * * * * は「毎分」(1分ごとに実行)。「* を1回でも書いたフィールド」は「そのフィールドは何でもOK」の意味。0 * * * * は「毎時0分に1回」(1時間ごと)。

/ (スラッシュ)─ 間隔指定

*/15 * * * * は「15分ごと」。「0分・15分・30分・45分」に実行。*/5 * * * * は5分ごと、0 */6 * * * は6時間ごと。開始値と間隔で表現でき、リアルタイム性の高い監視ジョブに便利。

, (カンマ)─ 複数指定

0 9,12,18 * * * は「毎日9時・12時・18時」の3回実行。営業時間内の複数タイミングで動かすジョブに使用。曜日フィールドでは 0 0 * * 1,3,5 で「月・水・金の0時」となる。

- (ハイフン)─ 範囲指定

0 9-17 * * 1-5 は「平日の9時〜17時の毎時0分」。営業時間中の定期処理・監視スクリプトの起動に頻用。範囲+間隔の組合せ(0-30/5 * * * *で0-30分の5分ごと)も可能。

? (クエスチョン)─ 未指定(Quartz系)

AWS EventBridge・Quartzで、日と曜日を両方指定しない場合に使う。「日と曜日は片方を?にする」のがEventBridge記法の必須ルール。0 12 * * ? * は「毎日12時に実行」(曜日は?で指定なし、末尾は年フィールド)。

L / W / # ─ 高度な指定(Quartz/EventBridge)

L=Last(月末・週末):0 0 L * ?で月末実行。W=Weekday(最近の平日):0 0 15W * ?で15日直近の平日。#=第n週:0 0 ? * MON#1で第1月曜日。伝統的なUnix cronでは使えないので注意。

プラットフォーム別書式差

Cron式は基本仕様が広く共通ですが、クラウドサービスや実装により細かな差異があります。ワークロード移植時は必ず対象プラットフォームの公式ドキュメントで確認してください。

サービスフィールド数タイムゾーン備考
Unix cron (Vixie cron)5サーバTZ伝統的POSIX形式・オンプレLinux
systemd timer柔軟なOnCalendar記法設定可能秒精度・実行漏れ検知が可能
Quartz Scheduler6-7設定可能秒・年フィールドあり・?/L/W/#対応
AWS EventBridge Scheduler6(分・時・日・月・曜日・年)設定可能日と曜日は片方?必須・rate式も選択可
GitHub Actions5UTC固定on: schedule: - cron: 記法。TZ変更不可
Kubernetes CronJob5spec.timeZone(1.27+)ジョブテンプレート+バックオフ制御
GCP Cloud Scheduler5設定可能App Engine cron.yaml形式も選択可
Azure Functions timer trigger6WEBSITE_TIME_ZONENCronTab(Quartz派生)ベース
Spring @Scheduled6zone属性で指定秒フィールドあり

タイムゾーン運用(UTC vs JST)

ハマりどころNo.1: TZ設定

Cronジョブの「日本時間で動かない」問題の8割はタイムゾーン設定。オンプレLinuxのcrontabはサーバの/etc/localtimeに従うのに対し、クラウドはUTCデフォルトが多く、JSTの想定と9時間ずれます。例:0 9 * * *をUTC実行するとJST18時に発火します。

主要プラットフォームのTZデフォルト

  • AWS EventBridge Scheduler:デフォルトUTC。ScheduleExpressionTimezoneAsia/Tokyoを明示指定可能
  • GitHub ActionsUTC固定・変更不可(回避策:ジョブ内でTZ変換)
  • Kubernetes CronJob:Kubernetes 1.27以降spec.timeZone: "Asia/Tokyo"で明示指定可能。それ以前はNode(kubelet)のTZ
  • GCP Cloud SchedulertimeZoneフィールドで明示指定(デフォルトAmerica/Los_Angeles)
  • Azure Functions:環境変数WEBSITE_TIME_ZONE=Tokyo Standard Timeで指定
  • Cron on Docker/K8s:DockerfileでENV TZ=Asia/Tokyoとtzdataインストールが必須

サマータイム(DST)の落とし穴

UTCで運用すればDSTの影響を受けませんが、TZにAmerica/New_York等を指定すると、DST切替日(3月・11月)に実行がスキップされたり2回実行されたりすることがあります。日本国内はDST未採用のためAsia/Tokyo指定なら問題ありませんが、多国籍展開ではUTCベースで設計し、通知メッセージのみJST変換するのが定石です。

systemd timerとの比較

systemd timerの優位性

systemd timerはCronを置き換える現代的スケジューラ。OnCalendar記法(*-*-* 09:00:00で毎日9時)で秒精度指定可能。Persistent=trueで電源断時のスキップを次回起動時に自動リカバリー、OnBootSec/OnUnitActiveSecで「起動○分後」等の相対時刻指定も可能。ログはjournalctlに集約されトラブルシューティングが容易です。

Cronの優位性

Cronは設定ファイル1行で表現できる可搬性が最大の強み。POSIX標準として世界中のUnix系OSで通用します。既存のシェルスクリプト資産をそのまま活用でき、DevOpsチームの学習コストが低い。K8s CronJobやAWS EventBridgeもCron記法を採用しているのはこの互換性ゆえです。

使い分けの指針

単発の日次バッチ・簡単な定期タスクはCronで十分。複雑な依存関係、失敗リトライ、実行漏れ許容不可、監視必須ならsystemd timerかジョブオーケストレータ(Airflow・Digdag・Prefect・Dagster)を検討。分単位より短い間隔が必要な場合はCronは選ばず、systemd timer・Quartz・専用ジョブスケジューラを使います。

anacronの役割

Cronはサーバ停止中の実行をスキップしますが、anacronは次回起動時に「昨日の分」を実行する仕組み。ノートPCや常時稼働しないサーバでも日次バックアップが漏れない設計。RHEL/CentOS標準の/etc/anacrontabで管理されます。systemdのPersistent機能と同等の思想です。

よく使うCron式パターン集

Cron式意味用途例
0 0 * * *毎日 0:00日次バックアップ
0 3 * * *毎日 3:00ログローテート・DBメンテナンス
0 9 * * 1-5平日 9:00営業日レポート送信
0 * * * *毎時 0分キャッシュクリア
*/5 * * * *5分ごとヘルスチェック
*/15 * * * *15分ごとSNS投稿予約・監視ポーリング
0 9,12,18 * * *毎日 9/12/18時営業時間の定期通知
0 0 1 * *毎月1日 0:00月次締め処理
0 0 * * 0毎週日曜 0:00週次サマリー生成
30 2 * * 6毎週土曜 2:30フルバックアップ
0 0 1 1 *毎年 1/1 0:00年次リセット
0 0 L * ?月末 0:00 (Quartz)月末バッチ・請求処理

Cronトラブルシュートと運用Tips

「手動なら動くのにcronで動かない」問題

最頻の原因は環境変数の欠落。cronはログインシェルではないためPATHLANGが最小限。crontab -eの先頭でSHELL=/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binを明示するか、スクリプト内でsource ~/.bashrcを実行してください。

ログ出力先の設定

* * * * * /path/to/script.sh >> /var/log/xxx.log 2>&1の形でstdout+stderrをファイルに追記。logrotate設定で日次ローテート+圧縮+古いログ削除を設定。systemd使用環境ならsystemd-cat経由でjournalへ送るのも良い選択。

実行状況の確認

grep CRON /var/log/syslog(Debian系)または journalctl -u cron.service --since=todayでcronデーモンの実行ログを確認。実行が記録されていない=cron書式エラー、実行はされたが失敗=スクリプト内エラー、と切り分けができます。

タイムアウト対策

長時間ジョブはtimeout 300 /path/to/script.shのようにtimeoutコマンドでハードリミットを設定。無限ループやハングによる次回実行との重複を防止。lock機構(flock)と組み合わせるとより堅牢になります:flock -n /tmp/xxx.lock -c "/path/to/script.sh"

Cron代替スケジューラの選択肢

Cronは単発ジョブ・小規模運用には最適ですが、依存関係管理・失敗リトライ・実行漏れ検知が必要な用途では専用のジョブオーケストレータが有利です。

ツール用途特徴
Cron (Vixie/paulcron)単発定時実行POSIX標準・軽量
systemd timerLinuxサーバ全般秒精度・Persistent・journalctl統合
Kubernetes CronJobK8s上の定時ジョブconcurrencyPolicy・backoffLimit
AWS EventBridge SchedulerAWSリソース定期実行1000万スケジュールまで対応
Apache Airflow依存DAGパイプラインPython DSL・Web UI・Backfill
DigdagデータパイプラインYAMLで依存関係定義
Prefect / Dagsterデータパイプライン新世代Airflow代替・型安全
Argo WorkflowsK8sネイティブContainer-native WF・CI/CDにも
Temporal / Cadenceワークフロー基盤長時間実行・状態管理

単純な定時実行はCron、複雑な依存管理はAirflow等、リアルタイム性は専用SaaSと使い分けるのが実務のベストプラクティスです。

よくある間違い・注意点

  • タイムゾーン設定漏れ — クラウドサービスはUTCデフォルトが多く、日本時間で「9時に動かしたい」つもりが実際はJST18時に発火。ScheduleExpressionTimezonespec.timeZoneで必ずTZを明示しましょう。
  • 「日」と「曜日」の同時指定 — Vixie cronでは日と曜日を両方指定するとOR条件(どちらかが一致したら実行)になり、意図しない頻度で発火します。Quartz/EventBridgeでは片方を?にしないと構文エラーになります。
  • 15分より短い間隔をCronで組む — Vixie cronの最小粒度は1分。GitHub Actionsは5分が最小推奨(それ以下はスキップ多発)。秒単位はQuartz/EventBridge/systemd timerを選ぶかloopスクリプトで対応します。
  • 実行漏れの検知不備 — Cronは実行漏れを検知・通知しません。Dead man's switch(Healthchecks.io・Cronitor等)で「N分間ログが来ない=障害」検知が定石。GitHub Actionsは長期リポジトリ非活動で自動停止されるので、定期commitやDependabotで維持が必要です。
  • 環境変数の未設定 — Cronはログインシェルではなく、ユーザーの.bashrcPATHを継承しません。スクリプト冒頭でフルパスやsource ~/.bashrcを明示しないと「手動なら動くのにcronだと動かない」トラブルの主因になります。
  • ログを見捨てる — Cronの標準出力はデフォルトでメール送信されます(MAILTO)。メールサーバ未設定の環境では出力が消えるため、>> /var/log/xxx.log 2>&1でファイル出力するか、systemd timerでjournalctl集約を推奨。

関連する規格・ドキュメント

  • POSIX (IEEE Std 1003.1) crontab ― Unix系OSにおけるcrontabコマンドの標準仕様。分・時・日・月・曜日の5フィールドを規定。
  • RFC 5545 iCalendar RRULE ― カレンダー系スケジューラのRRULE仕様。反復規則の代替表現として使用。
  • ISO 8601 ― 日時表現の国際規格。Cron代替のsystemd timerではISO 8601風の記法を採用。
  • tz database (IANA Time Zone Database)Asia/Tokyo等のタイムゾーン識別子の管理団体。
  • crontab(5) manual page ― Vixie cron/paulcron等のcrontabファイル書式の公式マニュアル。
  • Quartz Cron Expression ― Java系スケジューラの拡張Cron記法。6-7フィールド・?/L/W/#対応。

参考文献・公式資料

Cron式・ジョブスケジューラ実装の詳細は、以下の公式ドキュメントを参照してください。

※本ページの実行時刻計算は簡易実装であり、厳密なCron評価にはlibcron・croniter・cronsub等のライブラリや対象プラットフォームの公式スケジューラを使用してください。特に、うるう年・月末・DST境界における挙動はプラットフォームにより差があり、本番運用ではドライラン・ステージング検証を推奨します。

よくある質問(FAQ)

日本時間で動く?

サーバのタイムゾーン設定次第です。多くのクラウドサービスはUTCがデフォルトで、JSTと9時間ずれます。AWS EventBridgeはScheduleExpressionTimezone、K8s CronJobはspec.timeZone、GCPはtimeZoneで明示指定を。GitHub ActionsはUTC固定・変更不可なので、時刻計算はUTC基準で組み立ててください。

15分より短い頻度で動かせる?

Vixie cronの最小粒度は1分で、それ以下はsystemd timer(秒指定可)、Quartz、AWS EventBridge(rate式:1 minute~)、専用ジョブスケジューラを使うか、1分毎cron内でループする実装で対応します。GitHub Actionsは5分間隔でも実行遅延・スキップが頻発するので用途を選びます。

GUI管理ツールは何がある?

crontab.guruがCron式の可読化・検証で最も普及。実行可視化はcron-view、WebhookモニタリングはHealthchecks.io・Cronitor・Better Uptimeが定番。ジョブ依存関係管理まで含めるとAirflow・Digdag・Prefect・Dagsterのジョブオーケストレータへの移行を検討します。

「日」と「曜日」を両方指定するとどうなる?

Vixie cronではOR条件(どちらか一致で実行)となり、意図しない発火頻度になります。例:0 0 15 * 5は「毎月15日 OR 毎週金曜」の0時。Quartz/AWS EventBridgeでは?を使って片方を無視する規約:0 0 15 * ?で「毎月15日のみ」を明示します。

実行漏れを検知する方法は?

Cronは実行漏れ通知機能を持ちません。Dead man's switch方式(Healthchecks.io・Cronitor.io・Sentry Crons)でジョブ末尾にpingを送り、「N分間pingが来ない=異常」と検知します。systemd timerならPersistent=trueで電源断による欠落を次回起動時に自動リカバリーできます。

Cronで環境変数が読めないのはなぜ?

Cronはログインシェルではないため、~/.bashrc/etc/profileを読み込みません。PATH=・LANG=・TZ=等はcrontab先頭で明示するか、スクリプト内でsource ~/.bashrcを実行してください。「手動なら動く、cronだと動かない」の主因です。

CronのログはどこにEmit される?

デフォルトはローカルメール(/var/mail/{user})にstdout/stderrが送られます。メールサーバ未設定の環境ではジョブ内で明示的にファイル出力>> /var/log/xxx.log 2>&1)が必須。systemd timerならjournalctlに自動集約され、journalctl -u xxx.timerで参照可能です。

K8s CronJobで並列実行を防ぐには?

spec.concurrencyPolicy: Forbidで「前回のJobが実行中なら新規スキップ」に設定できます。Allow(デフォルト)・Replace(前回を止めて新規実行)と選べます。長時間ジョブではForbid必須、リアルタイム性優先ならReplaceを選択します。

DockerコンテナでCronを動かすのは?

可能ですがPID 1問題に注意。CronをPID 1で起動するとSIGTERMを受け取らずgraceful shutdown不可。対策はtini/dumb-initで親プロセス化するか、K8s CronJob等のオーケストレータに任せるのが定石。ENV TZ=Asia/Tokyotzdataパッケージのインストールも忘れずに。

@reboot や @yearly の予約語は?

Vixie cronの特殊予約語として @reboot(起動時1回)、@yearly(=0 0 1 1 *)、@monthly@weekly@daily@hourly があり、可読性が高い書き方。ただしPOSIX非標準で、AWS EventBridge・GitHub Actionsなど非対応の実装もあります。

Cronでリトライを実装する方法は?

Cron自体はリトライ機能を持ちません。スクリプト内でwhile+sleepでリトライするか、K8s CronJobのbackoffLimit、AWS EventBridge SchedulerのRetryPolicyで対応します。恒久的な失敗を防ぐため、指数バックオフ+Dead-letter queueの組合せが定石です。

2月29日や月末を安全に指定するには?

0 0 29 2 *は平年に発火しません。安全なのはQuartz/EventBridgeのL指定0 0 L * ?で月末)。Vixie cronで月末を扱うには「毎日実行して、シェルスクリプト内で[ $(date +%d) = $(cal | tail -2 | head -1 | awk '{print $NF}') ]」等の条件分岐が必要です。

ケース別 Cron設計シナリオ

日次バックアップ(DB+オブジェクトストレージ)

0 3 * * *で毎日3時に実行(ユーザーアクセスの少ない時間帯)。Dead man's switch連携でHealthchecks.ioに完了ping送信、24時間ping無しでアラート。バックアップ先はS3 Standard-IA → Glacier Deep Archiveへ90日でライフサイクル移行し月額$0.001/GB程度に圧縮。

週次レポート配信(Slack/メール)

0 9 * * 1で毎週月曜9時、営業日レポートをSlack Webhookへ投稿。祝日判定はスクリプト内で内閣府CSVを参照するか、Google Calendar APIで動的判定。月末最終営業日は0 17 25-31 * *+スクリプト内チェックで月末判定するのが定石。

SNS投稿予約(15分間隔ポーリング)

*/15 * * * *で15分ごとにDBの予約投稿をチェック→X/Bluesky APIへ投稿。処理時間短くAPI Rate Limit考慮でloopではなく都度cron方式。Race Condition対策で「processing」ステータス排他制御必須。冪等性を確保するとリトライ安全に。

ヘルスチェック(1分間隔ping)

* * * * *で毎分curlによる外形監視。3回連続失敗でPagerDuty通知。これがcron限界の粒度で、それより短い間隔はGrafana Cloud Synthetic Monitoring・Datadog Synthetics・UptimeRobot等の専用SaaSを利用します。1分間隔cron自体もタイムアウト60秒に注意。