サーバーメンテナンスの自動化、データパイプラインのスケジューリング、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-cron、cron、croner、Breeなどのスケジューリングライブラリを提供しています:
// ===== 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はschedule、APScheduler、python-crontab、Celery 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式をマスターすることは、信頼性の高い時間ベースの自動化を必要とするすべての開発者にとって不可欠です。この総合ガイドをブックマークして参考にしてください。