cron 표현식은 Linux cron, GitHub Actions, Kubernetes CronJob, AWS EventBridge, 그 외 수십 개의 스케줄러에서 작업 실행 시점을 제어합니다. 문법은 간결하지만 직관적이지 않습니다——0 9 * * 1-5는 참조 자료 없이 한번에 읽기 어렵습니다. 온라인 파서가 표현식의 의미를 영어 문장으로 설명하고 다음 실행 시각을 보여줍니다.
cron 표현식 구조
표준 cron 표현식은 공백으로 구분된 5개 필드를 가집니다:
┌───────────── 분 (0–59)
│ ┌───────────── 시 (0–23)
│ │ ┌───────────── 일 (1–31)
│ │ │ ┌───────────── 월 (1–12)
│ │ │ │ ┌───────────── 요일 (0–7, 0과 7은 일요일)
│ │ │ │ │
* * * * *
다른 형식을 쓰는 시스템도 있습니다. Spring과 Quartz는 맨 앞에 초 필드를 더하고(Quartz는 맨 끝의 연도도 선택 가능), AWS EventBridge는 맨 끝에 연도 필드를 더합니다. ZeroTool 파서는 표준 5필드 형식만 받으며 L, #, ?는 지원하지 않습니다.
특수 문자
| 문자 | 의미 | 예 |
|---|---|---|
* | 모두 / 매 | * * * * * — 매 분 |
, | 목록 | 1,15 * * * * — 1분과 15분에 |
- | 범위 | 1-5 * * * * — 1분부터 5분 |
/ | 스텝 | */15 * * * * — 15분마다 |
L | 마지막 | 0 0 L * * — 월 말일(비표준) |
# | n번째 요일 | 0 10 * * 1#2 — 2번째 월요일(비표준) |
? | 특정 값 없음 | 일 또는 요일 필드에서 사용(Quartz) |
자주 사용하는 cron 표현식 20개
N분마다
# 매 분
* * * * *
# 5분마다
*/5 * * * *
# 15분마다
*/15 * * * *
# 30분마다
*/30 * * * *
시간별 및 일별
# 매 시 정각
0 * * * *
# 매일 자정 UTC
0 0 * * *
# 매일 오전 9시 UTC
0 9 * * *
# 하루 두 번 — 오전 8시와 오후 8시
0 8,20 * * *
평일 스케줄
# 평일 오전 9시
0 9 * * 1-5
# 매주 월요일 오전 9시
0 9 * * 1
# 월, 수, 금 정오
0 12 * * 1,3,5
# 주말 오전 10시
0 10 * * 0,6
월별 및 분기별
# 매월 1일 자정
0 0 1 * *
# 매월 1일과 15일 자정
0 0 1,15 * *
# 각 분기 첫날 (1월, 4월, 7월, 10월)
0 0 1 1,4,7,10 *
특정 시간
# 새해 첫날 자정
0 0 1 1 *
# 매주 일요일 오전 4시 (유지보수 시간)
0 4 * * 0
# 6시간마다
0 */6 * * *
플랫폼별 주의사항
Linux crontab
표준 5필드 문법. crontab -e로 편집합니다. 타임존은 시스템 타임존입니다.
# 현재 crontab 확인
crontab -l
# crontab 편집
crontab -e
GitHub Actions
POSIX 5필드 문법을 씁니다. 선택 항목인 timezone 키를 지정하지 않으면 UTC로 실행되고, 최소 간격은 5분입니다. 매시 정각처럼 부하가 높은 시간에는 실행이 지연되거나 아예 빠질 수 있습니다(GitHub Docs):
on:
schedule:
- cron: '0 9 * * 1-5' # 평일 오전 9시 UTC
한국 표준시(KST)로는 UTC+9이므로 한국시간 오전 9시 = UTC 자정(0시)입니다.
AWS EventBridge / CloudWatch Events
분, 시, 일, 월, 요일, 연도의 6필드 형식 또는 별도의 “rate 표현식” 사용(AWS 문서):
cron(0 9 ? * MON-FRI *)
rate(5 minutes)
?는 일 또는 요일 필드 중 하나(둘 다는 아님)에 필요합니다.
Kubernetes CronJob
표준 5필드 문법. 타임존 필드(spec.timeZone)는 Kubernetes 1.27+에서 사용 가능합니다:
spec:
schedule: "0 9 * * 1-5"
timeZone: "Asia/Seoul"
cron 표현식 빠르게 읽기
이 패턴에 익숙해지세요:
- 앞의
0+ 시 필드 = “그 시의 정각” - 필드의
*= 해당 필드의 “모든 단위” */n= “n단위마다”-로 구분된 두 숫자 = 범위,로 구분된 숫자 = 특정 값 목록
0 9 * * 1-5는: 0분, 9시, 모든 날, 모든 월, 평일 → 평일 오전 9:00.
cron 문제 디버깅
작업이 실행되지 않은 경우 확인사항:
- cron 데몬이 실행 중인가? (
systemctl status cron) - 스크립트가 실행 가능한가? (
chmod +x script.sh) - 스크립트에서 절대 경로를 사용하는가? (cron은
$PATH가 최소한) - crontab을 저장했는가? (
crontab -l로 확인) - 로그 확인:
/var/log/syslog또는/var/log/cron
출력이 사라진 경우: cron은 기본적으로 출력을 이메일로 보냅니다. 로그 파일로 리다이렉트하세요:
0 9 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
타임존 혼란: cron은 시스템 타임존으로 실행됩니다. cronie(Fedora, RHEL)는 crontab의 CRON_TZ를 스케줄 타임존으로 읽고, TZ는 작업이 보는 환경 변수만 바꿉니다. CRON_TZ를 무시하는 구현도 있으니 man 5 crontab으로 확인하세요:
CRON_TZ=Asia/Seoul
0 9 * * 1-5 /path/to/script.sh
프로덕션에 적용하기 전에 스케줄을 검증하세요. cron 표현식 파서 사용해보기 →