백업 예약, 배포 자동화, 정기 정리 스크립트 실행 등 cron은 Unix/Linux 시스템의 태스크 스케줄링 핵심입니다. 이 치트시트는 50개 이상의 복사 가능한 cron 표현식 예시를 빈도별로 제공합니다.
1. Cron 표현식 구문
표준 cron 표현식은 공백으로 구분된 5개 필드로 구성됩니다:
┌───────────── 분 (0–59)
│ ┌─────────── 시 (0–23)
│ │ ┌───────── 일 (1–31)
│ │ │ ┌─────── 월 (1–12)
│ │ │ │ ┌───── 요일 (0–7)
│ │ │ │ │
* * * * * command_to_execute명령어는 5개 필드 뒤에 옵니다. Cron 생성기 도구로 시각적으로 구성할 수 있습니다.
2. 특수 문자
Cron은 4개의 특수 문자를 사용합니다:
| 문자 | 의미 | 예시 | 설명 |
|---|---|---|---|
| * | 해당 필드의 모든 값과 일치 | * * * * * | Every minute |
| , | 값 목록 지정 | 0 9 * * 1,3,5 | Mon, Wed, Fri at 9 AM |
| - | 범위 정의 | 0 9 * * 1-5 | Mon through Fri at 9 AM |
| / | 단계 간격 정의 | */10 * * * * | Every 10 minutes |
3. 50개 이상의 Cron 표현식 예시
가장 많이 사용되는 cron 스케줄을 담은 표입니다.
X분마다
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| * * * * * | Every minute | 10:00, 10:01, 10:02 ... |
| */1 * * * * | Every minute (explicit) | 10:00, 10:01, 10:02 ... |
| */2 * * * * | Every 2 minutes | 10:00, 10:02, 10:04 ... |
| */5 * * * * | Every 5 minutes | 10:00, 10:05, 10:10 ... |
| */10 * * * * | Every 10 minutes | 10:00, 10:10, 10:20 ... |
| */15 * * * * | Every 15 minutes | 10:00, 10:15, 10:30, 10:45 |
| */20 * * * * | Every 20 minutes | 10:00, 10:20, 10:40 ... |
| */30 * * * * | Every 30 minutes | 10:00, 10:30, 11:00 ... |
| 0,15,30,45 * * * * | At 0, 15, 30, 45 minutes past each hour | 10:00, 10:15, 10:30, 10:45 |
매시
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| 0 * * * * | Every hour (at minute 0) | 10:00, 11:00, 12:00 ... |
| 30 * * * * | Every hour at minute 30 | 10:30, 11:30, 12:30 ... |
| 15 * * * * | Every hour at minute 15 | 10:15, 11:15, 12:15 ... |
| 0 */2 * * * | Every 2 hours | 00:00, 02:00, 04:00 ... |
| 0 */3 * * * | Every 3 hours | 00:00, 03:00, 06:00 ... |
| 0 */4 * * * | Every 4 hours | 00:00, 04:00, 08:00 ... |
| 0 */6 * * * | Every 6 hours | 00:00, 06:00, 12:00, 18:00 |
| 0 */8 * * * | Every 8 hours | 00:00, 08:00, 16:00 |
| 0 */12 * * * | Every 12 hours | 00:00, 12:00 |
매일
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| 0 0 * * * | Daily at midnight (00:00) | Tomorrow 00:00 |
| 0 1 * * * | Daily at 1:00 AM | Tomorrow 01:00 |
| 0 6 * * * | Daily at 6:00 AM | Tomorrow 06:00 |
| 30 7 * * * | Daily at 7:30 AM | Tomorrow 07:30 |
| 0 9 * * * | Daily at 9:00 AM | Tomorrow 09:00 |
| 30 8 * * * | Daily at 8:30 AM | Tomorrow 08:30 |
| 0 12 * * * | Daily at noon (12:00) | Tomorrow 12:00 |
| 0 15 * * * | Daily at 3:00 PM | Tomorrow 15:00 |
| 0 18 * * * | Daily at 6:00 PM | Tomorrow 18:00 |
| 0 23 * * * | Daily at 11:00 PM | Tomorrow 23:00 |
| 0 8-17 * * * | Every hour from 8 AM to 5 PM | 08:00, 09:00 ... 17:00 |
| 0 9,12,18 * * * | Three times a day (9 AM, noon, 6 PM) | 09:00, 12:00, 18:00 |
매주
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| 0 9 * * 1 | Every Monday at 9:00 AM | Next Monday 09:00 |
| 0 9 * * 1-5 | Weekdays (Mon-Fri) at 9:00 AM | Next weekday 09:00 |
| 0 0 * * 0 | Every Sunday at midnight | Next Sunday 00:00 |
| 0 0 * * 6,0 | Saturday & Sunday at midnight | Next Sat/Sun 00:00 |
| 0 17 * * 5 | Every Friday at 5:00 PM | Next Friday 17:00 |
| 0 9 * * 1,3,5 | Mon, Wed, Fri at 9:00 AM | Next Mon/Wed/Fri 09:00 |
| 0 8-17 * * 1-5 | Hourly 8AM–5PM, weekdays only | Next weekday 08:00 |
| 30 6 * * 1-5 | Weekdays at 6:30 AM | Next weekday 06:30 |
매월
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| 0 0 1 * * | 1st of every month at midnight | Next month, 1st 00:00 |
| 0 0 15 * * | 15th of every month at midnight | Next 15th 00:00 |
| 0 9 1 * * | 1st of every month at 9:00 AM | Next month, 1st 09:00 |
| 0 0 1,15 * * | 1st and 15th at midnight | Next 1st or 15th 00:00 |
| 0 0 * * 5L | Last Friday of the month (non-std) | Last Fri 00:00 |
| 0 9 * * 1#1 | First Monday of the month (non-std) | First Mon 09:00 |
| 0 0 28 * * | 28th of every month at midnight | Next 28th 00:00 |
매년/분기별
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| 0 0 1 1 * | January 1st at midnight | Jan 1 00:00 |
| 0 0 1 1,4,7,10 * | Quarterly: Jan, Apr, Jul, Oct 1st | Next quarter 00:00 |
| 0 0 1 1,7 * | Bi-annually: Jan 1 & Jul 1 | Jan 1 or Jul 1 00:00 |
| 0 0 25 12 * | December 25th at midnight | Dec 25 00:00 |
| 0 0 1 */3 * | Every 3 months on the 1st | Next 1st in 3 months |
| 0 0 1 */6 * | Every 6 months on the 1st | Next 1st in 6 months |
비즈니스 & DevOps
| 표현식 | 설명 | 다음 실행 예시 |
|---|---|---|
| 0 2 * * * | Database backup at 2:00 AM daily | Tomorrow 02:00 |
| 0 3 * * 0 | Log rotation every Sunday at 3 AM | Next Sunday 03:00 |
| 0 4 1 * * | Monthly DB cleanup on 1st at 4 AM | Next month, 1st 04:00 |
| 0 1 * * * | SSL cert check daily at 1 AM | Tomorrow 01:00 |
| */5 * * * * | Health check every 5 minutes | 10:00, 10:05, 10:10 ... |
| 0 5 * * 1-5 | Deploy window: weekdays at 5 AM | Next weekday 05:00 |
| 0 0 * * * | Rotate logs daily at midnight | Tomorrow 00:00 |
| 0 */4 * * * | Send report digest every 4 hours | 00:00, 04:00, 08:00 ... |
| 0 22 * * 5 | Friday night maintenance at 10 PM | Next Friday 22:00 |
| 30 2 * * * | Temp file cleanup at 2:30 AM daily | Tomorrow 02:30 |
4. Crontab 명령어
crontab 명령어로 사용자별 cron 파일을 관리합니다:
| 명령어 | 기능 |
|---|---|
| crontab -e | Edit your crontab file (opens in default editor) |
| crontab -l | List all cron jobs for the current user |
| crontab -r | Remove all cron jobs for the current user (use with caution!) |
| crontab -u alice -l | List cron jobs for a specific user (requires root) |
| crontab -u alice -e | Edit crontab for a specific user (requires root) |
| crontab filename | Install a crontab from a file (overwrites existing) |
# Edit crontab
crontab -e
# List all cron jobs
crontab -l
# Backup current crontab to a file
crontab -l > my-crontab-backup.txt
# Install crontab from a file
crontab my-crontab-backup.txt
# Remove all cron jobs (careful!)
crontab -r5. 플랫폼별 구문
Cron 구문은 플랫폼마다 다릅니다:
5필드 표준 형식.
# Standard 5-field crontab
*/5 * * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1schedule.cron에서 5필드. 항상 UTC.
# .github/workflows/scheduled.yml
on:
schedule:
- cron: '0 9 * * 1-5' # Weekdays 9AM UTC6필드. ? 사용.
# AWS EventBridge (6 fields, note the ?)
cron(0 9 ? * MON-FRI *) # Weekdays 9AM UTC5필드 표준. K8s 1.27+에서 timezone 지원.
# Kubernetes CronJob spec
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *"
timeZone: "America/New_York" # K8s 1.27+vercel.json에서 5필드. UTC.
// vercel.json
{
"crons": [{
"path": "/api/cron/daily-report",
"schedule": "0 9 * * *"
}]
}6. 자주 하는 실수
Cron에서 가장 흔한 실수:
Cron은 기본적으로 시스템 타임존. CI/CD는 UTC.
flock 또는 락 파일 사용.
UTC를 사용하여 문제 회피.
둘 다 설정되면 둘 중 하나 일치 시 실행.
최소 해상도 1분. 서브미닛에는 sleep 사용.
Cron 작업은 최소 환경으로 실행. 전체 경로 사용.
# Gotcha: overlapping runs - use flock to prevent
*/5 * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/script.sh
# Gotcha: environment - always use full paths
0 2 * * * /usr/bin/python3 /home/user/scripts/backup.py >> /var/log/backup.log 2>&1
# Gotcha: 30-second workaround (two entries)
* * * * * /path/to/script.sh
* * * * * sleep 30 && /path/to/script.sh
# Gotcha: PATH not set - define it at the top of your crontab
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Gotcha: percent signs (%) must be escaped in crontab
# Wrong:
0 0 * * * echo "Today is $(date +%Y-%m-%d)"
# Correct:
0 0 * * * echo "Today is $(date +\%Y-\%m-\%d)"Sample Crontab File
Here is a complete, real-world crontab file combining several patterns discussed above:
# =============================================
# Crontab for: webserver (production)
# Last updated: 2025-01-15
# =============================================
# Environment
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="ops-team@example.com"
# --- BACKUPS ---
# Full database backup at 2:00 AM daily
0 2 * * * /usr/bin/flock -n /tmp/db-backup.lock /opt/scripts/db-backup.sh >> /var/log/db-backup.log 2>&1
# Incremental file backup every 6 hours
0 */6 * * * /opt/scripts/file-backup.sh >> /var/log/file-backup.log 2>&1
# --- MAINTENANCE ---
# Clear temp files older than 7 days, daily at 3 AM
0 3 * * * /usr/bin/find /tmp -type f -mtime +7 -delete
# Rotate application logs every Sunday at 4 AM
0 4 * * 0 /opt/scripts/rotate-logs.sh >> /var/log/log-rotation.log 2>&1
# --- MONITORING ---
# Health check every 5 minutes
*/5 * * * * /opt/scripts/healthcheck.sh > /dev/null 2>&1
# SSL certificate expiry check daily at 6 AM
0 6 * * * /opt/scripts/check-ssl.sh
# Disk space alert if usage > 90%, every hour
0 * * * * /opt/scripts/disk-alert.sh
# --- REPORTS ---
# Send daily summary at 8 AM on weekdays
0 8 * * 1-5 /opt/scripts/daily-report.sh
# Monthly analytics report on the 1st at 9 AM
0 9 1 * * /opt/scripts/monthly-report.sh7. 테스트 및 디버그
프로덕션 배포 전:
Cron 표현식 파서로 다음 실행 시간 확인.
/var/log/syslog 또는 /var/log/cron 확인.
stdout/stderr를 로그 파일로 캡처.
먼저 * * * * *로 테스트.
MAILTO=""로 메일 비활성화.
# Redirect all output to a log file
0 2 * * * /path/to/backup.sh >> /var/log/cron-backup.log 2>&1
# Disable cron mail for this job
0 2 * * * /path/to/backup.sh > /dev/null 2>&1
# Set MAILTO at the top of crontab
MAILTO=""
# Or send to a real address
MAILTO="admin@example.com"
# Check cron logs on Debian/Ubuntu
grep CRON /var/log/syslog | tail -20
# Check cron logs on CentOS/RHEL
grep CRON /var/log/cron | tail -20
# On systems using journald (systemd)
journalctl -u cron --since "1 hour ago"
# Quick test: add a job that writes to a file
# Then check if the file gets updated
* * * * * echo "cron works: $(date)" >> /tmp/cron-test.log
# Verify your crontab was saved correctly
crontab -l | grep -v '^#'
# Check if cron daemon is running
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHELCommon Cron Debugging Checklist
| Check | How to Verify |
|---|---|
| Cron daemon running? | systemctl status cron (or crond) |
| Crontab saved? | crontab -l and look for your entry |
| Script executable? | chmod +x /path/to/script.sh |
| Full paths used? | Use which python3 to find full path |
| Output captured? | Add >> /tmp/debug.log 2>&1 |
| Permissions correct? | Script owner = crontab owner |
| No syntax errors? | bash -n /path/to/script.sh |
| Timezone correct? | timedatectl or date to check |
Cron 표현식을 인터랙티브하게 구성하고 테스트하세요:
8. 자주 묻는 질문
Cron 표현식의 형식은?
표준 cron 표현식은 5개 필드: 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-7).
*/5의 의미는?
*/5는 "매 5단위"를 의미. 분 필드에서 5분마다 실행.
30초마다 실행하려면?
표준 cron은 초 미지원. 2개 엔트리를 만들고 하나에 sleep 30 추가.
cron과 crontab의 차이는?
Cron은 데몬. Crontab은 작업 파일.
Windows에서 cron을 쓸 수 있나요?
네이티브 Windows에는 cron이 없습니다. 작업 스케줄러가 대안. WSL에서는 cron 사용 가능.