cron 표현식은 Linux cron, GitHub Actions, Kubernetes CronJob, AWS EventBridge, 그 외 수십 개의 스케줄러에서 작업 실행 시점을 제어합니다. 문법은 간결하지만 직관적이지 않습니다——0 9 * * 1-5는 참조 자료 없이 한번에 읽기 어렵습니다. 온라인 파서가 표현식의 의미를 영어 문장으로 설명하고 다음 실행 시각을 보여줍니다.

cron 표현식 파싱 및 검증 →

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 문제 디버깅

작업이 실행되지 않은 경우 확인사항:

  1. cron 데몬이 실행 중인가? (systemctl status cron)
  2. 스크립트가 실행 가능한가? (chmod +x script.sh)
  3. 스크립트에서 절대 경로를 사용하는가? (cron은 $PATH가 최소한)
  4. crontab을 저장했는가? (crontab -l로 확인)
  5. 로그 확인: /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 표현식 파서 사용해보기 →