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 9 * * 1-5평일 오전 9시
0 0 1 * *매월 1일 자정

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 표현식을 마스터하는 것은 안정적인 시간 기반 자동화가 필요한 모든 개발자에게 필수적입니다. 이 종합 가이드를 북마크하여 참고하세요.

무료 온라인 도구로 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 레퍼런스: 서비스 정의, 볼륨, 네트워크, 환경 변수, 스택 예시.