DevToolBox無料
ブログ

Cron式ジェネレーター&パーサー:構文、例、コードガイド

17分で読了by DevToolBox

サーバーメンテナンスの自動化、データパイプラインのスケジューリング、CI/CDワークフローのトリガーなど、cron式は時間ベースのジョブスケジューリングの共通言語です。cron式ジェネレーターはこれらのパターンを視覚的に構築し、cronパーサーは暗号のような文字列を人間が読める説明に変換します。このガイドではcron構文からJavaScript、Python、Bash、クラウドプラットフォームの実践例まで全てをカバーします。

無料オンラインCron式ジェネレーター&パーサーツールをお試しください。

Cron式とは?

Cron式は自動化タスクの繰り返しスケジュールを定義するコンパクトな文字列です。名前はギリシャ語のchronos(時間)とUnixのcronデーモンに由来します。cronはタスクスケジューリングの事実上の標準となっています。

クラシックなUnix crontab形式では、cron式は5つのフィールドで構成されます:分 時 日 月 曜日。各フィールドは数値、ワイルドカード、範囲、リスト、ステップ値を受け付けます。

現在、cron式はKubernetes CronJob、GitHub Actions、AWS EventBridge、Vercel cronで使用されています。cron構文の理解はすべての開発者にとって不可欠です。

Cron式の構文解説

標準cron式は5つのフィールドを使用します。各フィールドは時間の単位を表します:

フィールド許可値特殊文字説明
0-59* , - /実行する分
0-23* , - /時(24時間形式)
1-31* , - / ? L W月の日
1-12* , - /年の月
曜日0-7* , - / ? L #曜日

特殊文字*は全ての値にマッチ。カンマ,はリスト区切り。ハイフン-は範囲定義。スラッシュ/はステップ値定義(例:*/5=5分毎)。

形式は:* * * * *(分 時 日 月 曜日)。この5フィールドパターンがcronスケジュール定義の核心です。

Cron式の例テーブル

本番システムで最も一般的なcron式の例です:

Cron式説明
* * * * *毎分
*/5 * * * *5分毎
0 * * * *毎時
0 0 * * *毎日深夜0時
0 9 * * 1-5平日9時
0 0 1 * *毎月1日深夜0時

Cronジョブのコード例

JavaScript / Node.js Cronジョブ

Node.jsはnode-croncroncronerBreeなどのスケジューリングライブラリを提供しています:

// ===== node-cron (most popular) =====
// npm install node-cron
const cron = require('node-cron');

// Run every 5 minutes
cron.schedule('*/5 * * * *', () => {
  console.log('Running task every 5 minutes');
  // Your task logic here
});

// Run weekdays at 9:00 AM
cron.schedule('0 9 * * 1-5', () => {
  console.log('Good morning! Running weekday task.');
}, {
  timezone: 'America/New_York'
});

// Validate a cron expression
console.log(cron.validate('*/5 * * * *')); // true
console.log(cron.validate('60 * * * *'));  // false

// ===== cron npm package =====
// npm install cron
const { CronJob } = require('cron');

const job = new CronJob(
  '0 */6 * * *',   // every 6 hours
  function () {
    console.log('Running every 6 hours');
  },
  null,             // onComplete
  true,             // start immediately
  'America/Chicago' // timezone
);

// ===== croner (modern, zero-dependency) =====
// npm install croner
import { Cron } from 'croner';

// Run every minute
const task = new Cron('* * * * *', () => {
  console.log('Tick every minute');
});

// Run at specific time, get next run
const next = task.nextRun();
console.log('Next execution:', next);

// Stop the job
task.stop();

// ===== Bree (worker-thread scheduler) =====
// npm install bree
const Bree = require('bree');

const bree = new Bree({
  jobs: [
    {
      name: 'backup',
      cron: '0 2 * * *',   // daily at 2 AM
      path: './jobs/backup.js'
    },
    {
      name: 'cleanup',
      cron: '0 0 * * 0',   // weekly on Sunday
      path: './jobs/cleanup.js'
    }
  ]
});

bree.start();

Python Cronスケジューリング

PythonはscheduleAPSchedulerpython-crontabCelery Beatを提供しています:

# ===== schedule library (human-friendly) =====
# pip install schedule
import schedule
import time

def backup_database():
    print("Backing up database...")

def send_report():
    print("Sending daily report...")

schedule.every(5).minutes.do(backup_database)
schedule.every().day.at("09:00").do(send_report)
schedule.every().monday.at("08:30").do(send_report)

while True:
    schedule.run_pending()
    time.sleep(1)

# ===== APScheduler (enterprise-grade) =====
# pip install apscheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.triggers.cron import CronTrigger

scheduler = BlockingScheduler()

# Using cron expression syntax
@scheduler.scheduled_job(CronTrigger.from_crontab('*/10 * * * *'))
def cleanup_temp_files():
    print("Cleaning temp files every 10 minutes")

# Using keyword arguments
@scheduler.scheduled_job('cron', hour=9, minute=0, day_of_week='mon-fri')
def weekday_report():
    print("Weekday report at 9:00 AM")

# First Monday of each month at 3 AM
@scheduler.scheduled_job('cron', day='1-7', day_of_week='mon', hour=3)
def monthly_audit():
    print("Monthly audit")

scheduler.start()

# ===== python-crontab (manage system crontab) =====
# pip install python-crontab
from crontab import CronTab

cron = CronTab(user='myuser')

# Create a new cron job
job = cron.new(
    command='/usr/bin/python3 /opt/app/backup.py >> /var/log/backup.log 2>&1'
)
job.setall('0 2 * * *')  # Daily at 2 AM
job.set_comment('Nightly database backup')
job.enable()

# List all cron jobs
for job in cron:
    print(f"{job.slices} -> {job.command}")

cron.write()  # Save changes

# ===== Celery Beat (distributed scheduling) =====
# pip install celery
# celeryconfig.py
from celery.schedules import crontab

beat_schedule = {
    'cleanup-every-hour': {
        'task': 'tasks.cleanup',
        'schedule': crontab(minute=0, hour='*/1'),
    },
    'weekly-report': {
        'task': 'tasks.send_report',
        'schedule': crontab(hour=9, minute=0, day_of_week=1),
    },
}

Bash / Linux Crontabコマンド

Linux/macOSではcrontab -eで編集、crontab -lで一覧表示:

# ===== Essential crontab commands =====

# Edit your user crontab
crontab -e

# List current cron jobs
crontab -l

# Remove all cron jobs (use with caution!)
crontab -r

# Edit another user's crontab (requires root)
sudo crontab -u www-data -e

# ===== Example crontab file =====
# Set environment variables at the top
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin
MAILTO=admin@example.com
TZ=UTC

# m h dom mon dow  command

# Backup database every night at 2 AM
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Run cleanup every 15 minutes with flock
*/15 * * * * flock -n /tmp/cleanup.lock /opt/scripts/cleanup.sh

# Send report on weekdays at 9 AM
0 9 * * 1-5 /opt/scripts/daily-report.sh 2>&1 | logger -t daily-report

# Rotate logs on the 1st of each month
0 0 1 * * /usr/sbin/logrotate /etc/logrotate.conf

# Health check every minute (ping monitoring service)
* * * * * curl -fsS --retry 3 https://hc-ping.com/your-uuid > /dev/null

# ===== System crontab (/etc/cron.d/) =====
# /etc/cron.d/myapp (includes username field)
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin

# Note: system crontab includes a user field
*/5 * * * * www-data /opt/myapp/cron/process-queue.sh
0 3 * * * root /opt/myapp/cron/maintenance.sh

# ===== Logging best practices =====

# Log with timestamp
0 * * * * /opt/scripts/job.sh 2>&1 | while read line; do \
  echo "$(date '+\%Y-\%m-\%d \%H:\%M:\%S') $line"; \
done >> /var/log/myjob.log

# MAILTO for error notifications
MAILTO=ops-team@example.com
# Only errors are emailed (stdout goes to log, stderr to email)
0 */6 * * * /opt/scripts/etl.sh >> /var/log/etl.log

クラウド & CI/CD Cronスケジューリング

Cron式はGitHub Actions、AWS EventBridge、Kubernetes CronJob、Vercel cronで使用されます:

# ===== GitHub Actions scheduled workflow =====
# .github/workflows/scheduled.yml
name: Scheduled Tasks
on:
  schedule:
    # Run every day at 6 AM UTC
    - cron: '0 6 * * *'
    # Run every Monday at 9 AM UTC
    - cron: '0 9 * * 1'
  workflow_dispatch: # Allow manual trigger

jobs:
  daily-task:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: ./scripts/daily-task.sh

---
# ===== AWS EventBridge (CloudWatch) cron =====
# Note: AWS cron has 6 fields (includes year)
# Format: minute hour day-of-month month day-of-week year

# Every 5 minutes
aws events put-rule \
  --name "every-5-min" \
  --schedule-expression "cron(*/5 * * * ? *)"

# Weekdays at 9 AM UTC
aws events put-rule \
  --name "weekday-morning" \
  --schedule-expression "cron(0 9 ? * MON-FRI *)"

# First day of each quarter
aws events put-rule \
  --name "quarterly" \
  --schedule-expression "cron(0 0 1 1,4,7,10 ? *)"

---
# ===== Kubernetes CronJob =====
# k8s-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: database-backup
spec:
  schedule: "0 2 * * *"           # Daily at 2 AM
  timeZone: "America/New_York"    # Available since k8s 1.27
  concurrencyPolicy: Forbid       # Prevent overlapping runs
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup
            image: myapp/backup:latest
            command: ["/bin/sh", "-c", "./backup.sh"]
            env:
            - name: DB_HOST
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: host
          restartPolicy: OnFailure

---
# ===== Vercel cron (vercel.json) =====
{
  "crons": [
    {
      "path": "/api/cron/daily-cleanup",
      "schedule": "0 0 * * *"
    },
    {
      "path": "/api/cron/hourly-sync",
      "schedule": "0 * * * *"
    },
    {
      "path": "/api/cron/weekly-report",
      "schedule": "0 9 * * 1"
    }
  ]
}

高度なCron機能

多くの実装では秒フィールド(6フィールド形式)や年フィールド(7フィールド形式)で構文を拡張しています。Quartz、node-cron、Spring Frameworkがサポートしています。

拡張特殊文字L=最後、W=最も近い平日、#=N番目の曜日の出現。

非標準の省略形@reboot@yearly@monthly@weekly@daily@hourly

Cronジョブのデバッグと監視

タイムゾーンの問題:crontabで常にTZ=UTCを設定してください。

PATHの問題:cronデーモンは最小限の環境で実行します。絶対パスを使用してください。

出力が未キャプチャ:stdoutとstderrを常にログファイルにリダイレクトしてください。

実行の重複flockで重複実行を防止してください。

Cronジョブのベストプラクティス

説明的なコメント:各crontabエントリをドキュメント化してください。

出力リダイレクトとログ:専用のログファイルにリダイレクトしてください。

flockによる排他制御:重複実行を防止してください。

SHELLとPATHの設定:環境を明示的に宣言してください。

絶対パスの使用:全ての場所で絶対パスを使用してください。

監視サービスの利用:healthchecks.ioやCronitorを使用してください。

タイムゾーンの意識:UTCを使用してドキュメント化してください。

よくある質問

Cron式の5つのフィールドは何を意味しますか?

5つのフィールドは:分(0-59)、時(0-23)、日(1-31)、月(1-12)、曜日(0-7)です。各フィールドは値、ワイルドカード(*)、範囲、リスト、ステップ値を受け付けます。

cronとsystemdタイマーの違いは?

cronは伝統的なUnixスケジューラーです。systemdタイマーはLinuxの現代的な代替手段で、イベントベースのトリガー、欠落した実行の処理、journalctlとの統合をサポートします。cronはクラウドプラットフォームで標準のままです。

N分ごとにcronジョブを実行するには?

分フィールドでステップ構文 */N を使用します。例:5分毎 = "*/5 * * * *"、15分毎 = "*/15 * * * *"。一定間隔にはステップ値が60を割り切れる必要があります。

関連ガイド:

Cron式をマスターすることは、信頼性の高い時間ベースの自動化を必要とするすべての開発者にとって不可欠です。この総合ガイドをブックマークして参考にしてください。

無料オンラインツールでCron式を即座に生成・解析。

𝕏 Twitterin LinkedIn
この記事は役に立ちましたか?

最新情報を受け取る

毎週の開発ヒントと新ツール情報。

スパムなし。いつでも解除可能。

Try These Related Tools

Cron Expression ParserCron Expression Generator⏲️Crontab Generator🔍Cron Expression Parser

Related Articles

Cron式の例:5分毎、毎日、毎週、毎月

実用的な例でcron式をマスター。

ServerlessのCron: GitHub Actions、Vercel Cron、Cloudflare Workers

Serverlessプラットフォームでのcron式をマスター。構文の違い、タイムゾーンの落とし穴、コピペ可能な例。

Docker Compose チートシート:サービス、ボリューム、ネットワーク

Docker Compose リファレンス:サービス定義、ボリューム、ネットワーク、環境変数、スタック例。