DevToolBoxFREE
BlogAdvertise

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
この記事は役に立ちましたか?

Stay Updated

Get weekly dev tips and new tool announcements.

No spam. Unsubscribe anytime.

Partner Picks

Sponsor this article

Place your product next to this developer topic with tracked clicks.

Ask about article sponsorship

This site uses cookies for analytics and to display ads. By continuing to browse, you agree. Privacy Policy