Cron 표현식 생성기
단계별 빌더로 Cron 표현식을 시각적으로 생성
빠른 프리셋
분
시
월별 일
월
요일
Cron 표현식
0 9 * * *minute hour day(month) month day(week)
Cron 표현식 생성기란?
Cron 표현식 생성기는 직접 작성하는 대신 시각적 인터페이스를 통해 Cron 스케줄 문자열을 구성하는 도구입니다. Cron 표현식은 반복 작업의 실행 시점을 정의하는 5개 필드(분, 시, 월별 일, 월, 요일)로 이루어진 문자열입니다. 이 형식은 1979년 원래의 Unix cron 데몬에서 유래했으며, 현재 crontab, Kubernetes CronJob, GitHub Actions, AWS EventBridge, Google Cloud Scheduler, 그리고 수십 개의 작업 스케줄링 라이브러리에서 사용됩니다.
Cron 표현식을 기억에 의존해 작성하는 것은 버그의 흔한 원인입니다. 다섯 개 필드는 직관적이지 않은 방식으로 상호작용합니다. 예를 들어 분 필드의 스텝 값 */15는 0, 15, 30, 45에 실행되지만, 5/15는 분 5부터 시작해 5, 20, 35, 50에 실행됩니다. 월별 일과 요일 필드를 와일드카드가 아닌 값으로 함께 사용하면 AND가 아닌 OR 조건이 만들어지는데, 이는 경험 많은 엔지니어도 종종 놀라는 부분입니다. 시각적 생성기는 원하는 스케줄을 선택하면 올바른 구문을 자동으로 생성해 이러한 모호함을 제거합니다.
Cron 생성기는 Cron 파서와 다릅니다. 파서는 기존 표현식을 받아 일반 언어로 설명합니다. 생성기는 반대 방향으로 작동합니다. 필요한 스케줄을 입력하면 도구가 일치하는 Cron 문자열을 출력합니다. 새로운 예약 작업을 만들 때는 생성기를, 기존 작업을 감사하거나 디버깅할 때는 파서를 사용하세요.
이 Cron 생성기를 사용하는 이유
Cron 표현식을 직접 작성하려면 필드 순서, 값 범위, 연산자 규칙을 모두 외워야 합니다. 필드 하나가 잘못 들어가면 매일 실행되어야 할 작업이 매분 실행됩니다. 이 생성기를 사용하면 스케줄을 시각적으로 선택하고 결과를 클릭 한 번으로 복사할 수 있습니다.
Cron 생성기 활용 사례
자주 사용하는 Cron 스케줄 프리셋
아래 표는 가장 자주 사용되는 스케줄의 Cron 표현식을 나열합니다. 대부분의 프로덕션 작업은 이러한 패턴 중 하나에 해당합니다. 개별 필드를 수정해 실제 타이밍에 맞게 조정하세요.
| 스케줄 | 표현식 | 일반적인 용도 |
|---|---|---|
| Every minute | * * * * * | Health checks, queue polling |
| Every 5 minutes | */5 * * * * | Metrics collection, cache refresh |
| Every 15 minutes | */15 * * * * | API sync, dashboard updates |
| Every hour | 0 * * * * | Log rotation, report generation |
| Every 6 hours | 0 */6 * * * | Database backups, digest emails |
| Daily at midnight | 0 0 * * * | Nightly batch jobs, cleanup scripts |
| Daily at 9 AM | 0 9 * * * | Daily reports, notification digests |
| Weekdays at 9 AM | 0 9 * * 1-5 | Business-hours tasks, standup reminders |
| Every Monday at midnight | 0 0 * * 1 | Weekly reports, dependency updates |
| First of every month | 0 0 1 * * | Billing runs, monthly aggregation |
| Every Sunday at 2:30 AM | 30 2 * * 0 | Full backups during low-traffic window |
| January 1st at midnight | 0 0 1 1 * | Annual reports, license renewals |
Cron 표현식의 구성 요소
모든 Cron 표현식은 왼쪽에서 오른쪽으로 읽는 정확히 5개의 필드로 구성됩니다. 각 필드는 특정 값과 연산자를 허용합니다. 이 규칙을 알면 프로덕션에서 만날 수 있는 모든 스케줄을 작성할 수 있습니다.
네 가지 연산자가 각 필드 내에서 값을 매칭하는 방식을 제어합니다. 조합해서 사용할 수 있습니다. 예를 들어 요일 필드의 1-5/2는 월요일, 수요일, 금요일을 의미합니다(범위 1-5, 스텝 2).
| 연산자 | 구문 | 예시 | 결과 |
|---|---|---|---|
| Wildcard | * | * (minute) | Every minute |
| List | a,b,c | 1,15 (day) | 1st and 15th |
| Range | a-b | 9-17 (hour) | 9 AM through 5 PM |
| Step | */n | */10 (minute) | Every 10 minutes |
| Range+Step | a-b/n | 10-30/5 (min) | 10, 15, 20, 25, 30 |
코드 예제
Node.js, Python, Go, bash에서 Cron 스케줄을 생성하고 등록하는 방법:
import { CronJob } from 'cron';
// Build a cron expression: every weekday at 9:00 AM
const expression = '0 9 * * 1-5';
const job = new CronJob(expression, () => {
console.log('Running weekday morning task');
});
job.start();
// Programmatic expression building
function buildCron({ minute = '*', hour = '*', dom = '*', month = '*', dow = '*' }) {
return `${minute} ${hour} ${dom} ${month} ${dow}`;
}
const expr = buildCron({ minute: '0', hour: '*/6', dow: '1-5' });
console.log(expr); // → "0 */6 * * 1-5"from crontab import CronTab
# Create a new cron job for the current user
cron = CronTab(user=True)
# Build a job: run backup.py every day at 2:30 AM
job = cron.new(command='python3 /home/user/backup.py')
job.setall('30 2 * * *')
print(job) # → 30 2 * * * python3 /home/user/backup.py
print(job.is_valid()) # → True
# Schedule every 15 minutes on weekdays
job2 = cron.new(command='/usr/bin/sync-data')
job2.minute.every(15)
job2.dow.during('MON', 'FRI')
cron.write() # Save to user's crontab
# Verify next run time
from croniter import croniter
from datetime import datetime
it = croniter('30 2 * * *', datetime.now())
print(it.get_next(datetime)) # → next 2:30 AM timestamppackage main
import (
"fmt"
"strings"
"github.com/robfig/cron/v3"
)
// BuildCron constructs a 5-field cron expression from parts
func BuildCron(minute, hour, dom, month, dow string) string {
fields := []string{minute, hour, dom, month, dow}
return strings.Join(fields, " ")
}
func main() {
// Generate: every weekday at 9 AM
expr := BuildCron("0", "9", "*", "*", "1-5")
fmt.Println(expr) // → 0 9 * * 1-5
// Validate and schedule it
c := cron.New()
_, err := c.AddFunc(expr, func() {
fmt.Println("Running scheduled task")
})
if err != nil {
fmt.Printf("Invalid expression: %v\n", err)
return
}
c.Start()
}# Open the crontab editor to add a new job crontab -e # Add a cron job without opening an editor: # Run cleanup.sh every Sunday at 3 AM (crontab -l 2>/dev/null; echo "0 3 * * 0 /home/user/cleanup.sh") | crontab - # Generate and add a job: every 10 minutes, log disk usage EXPR="*/10 * * * *" CMD="df -h >> /var/log/disk-usage.log" (crontab -l 2>/dev/null; echo "$EXPR $CMD") | crontab - # Verify the job was added crontab -l | tail -1 # → */10 * * * * df -h >> /var/log/disk-usage.log # Remove all cron jobs (use with caution) # crontab -r