crontab 생성기 & cron 표현식 빌더
브라우저에서 cron 표현식을 만들고 검증·해석합니다. 로컬 또는 UTC로 다음 실행을 미리 보고, POSIX 5필드 문법과 프리셋을 온라인에서 무료로 사용합니다.
자연어 설명
—
다음 5회 예정 실행
cron 표현식이란 무엇인가요?
cron 표현식은 반복 스케줄을 정의하는 다섯 필드 문자열입니다. 왼쪽에서 오른쪽으로 필드는 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-6, 0과 7 모두 일요일)입니다. 각 필드는 값, 목록(`1,3,5`), 범위(`1-5`), 와일드카드(`*` = 임의의 값), 단계(`*/15` = 15마다)를 받습니다. 다섯 필드의 조합이 예약된 명령이 실행될 시점을 정확히 정의합니다. 예를 들어 `0 9 * * 1-5`는 "분 0, 시 9, 임의의 일, 임의의 월, 요일은 월요일부터 금요일까지"로 읽히는데, 자연어로는 "평일 오전 9시"가 됩니다.
cron은 1979년 Unix 버전 7에서 시작되었고, 다섯 필드 문법은 40년이 넘는 시간 동안 사실상 변하지 않았습니다. 원래 문법이 얼마나 잘 설계되었는지를 보여 주는 증거입니다. 오늘날 cron 표현식은 Unix crontab 파일을 훌쩍 넘어 쓰입니다. Kubernetes CronJobs, GitHub Actions 워크플로, AWS EventBridge 규칙, GitLab CI 예약 파이프라인, Cloudflare Workers Cron Triggers, 그리고 모든 클라우드의 서버리스 플랫폼이 같은 다섯 필드 문법을 받아들입니다. cron을 한 번 익히면 현대 인프라 어디에서도 작업을 예약할 수 있다는 뜻입니다.
POSIX 표준은 다섯 개의 연산자를 정의합니다. `*`(임의의 값), `,`(값 목록), `-`(범위), `/`(단계), 그리고 월(JAN-DEC)과 요일(SUN-SAT)의 이름 토큰입니다. 대부분의 구현은 자주 쓰이는 다섯 가지 단축 표기도 확장합니다. `@yearly`(`0 0 1 1 *`), `@monthly`(`0 0 1 * *`), `@weekly`(`0 0 * * 0`), `@daily`(`0 0 * * *`), `@hourly`(`0 * * * *`)입니다. Quartz 스케줄러(Java 라이브러리)는 선택적 초 필드와 추가 연산자(`?`, `L`, `W`, `#`)로 이를 확장합니다. Java/Spring 환경에서는 유용하지만 표준 cron으로 이식되지는 않습니다. 본 도구는 POSIX 다섯 필드 표준을 따릅니다. 가장 지배적인 변종이며 Linux 서버, GitHub Actions 러너, Kubernetes 클러스터가 실제로 이해하는 형식이기 때문입니다.
POSIX cron의 한 가지 특이점은 특별히 주의할 만합니다. 일과 요일이 모두 제한되면(둘 다 `*`가 아니면) 스케줄은 둘 중 어느 한쪽이라도 일치할 때 실행됩니다. AND가 아니라 OR 의미입니다. 그래서 `0 0 1 * 5`는 매월 1일 그리고 매주 금요일에 실행되는 것이지 1일에 해당하는 금요일에만 실행되는 것이 아닙니다. 가장 흔한 cron 함정이며, 본 도구의 다음 실행 미리보기가 실제로 작업이 실행될 날짜·시간을 보여 주어 한눈에 드러나게 합니다. 배포 전에 반드시 확인하십시오.
모든 파싱과 다음 실행 시각 계산은 JavaScript로 완전히 브라우저 안에서 이루어집니다. 표현식, 스케줄, 그 밖의 어떤 데이터도 서버로 전송되지 않습니다. 본 도구는 표준 POSIX cron 표현식을 즉시 파싱해 자연어 설명과 다섯 번의 실행 미리보기를 제공하며, 프라이버시는 완전히 보장됩니다.
cron 표현식은 다른 개발자 도구와 밀접하게 연관됩니다. cron 작업은 예상 실행 시각과 Unix 타임스탬프를 대조해 디버깅하는 경우가 많고, 복잡한 스케줄은 JSON 구성으로 문서화되어 JSON 포맷터로 검증할 수 있습니다. OR 의미 규칙, 시간대 함정, Linux/Kubernetes/GitHub Actions 예제로 본 흔한 cron 변종을 다루는 심층 가이드는 cron 스케줄 레퍼런스를 참고하십시오.
# Linux crontab entry — runs every 15 minutes
*/15 * * * * /usr/local/bin/poll-api.sh
# Kubernetes CronJob — weekdays at 9:00 AM UTC
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-report
spec:
schedule: "0 9 * * 1-5"
timeZone: "UTC"
jobTemplate:
spec:
template:
spec:
containers:
- name: report
image: report-runner:1.0
restartPolicy: OnFailure
# GitHub Actions workflow — hourly
on:
schedule:
- cron: '0 * * * *'
# AWS EventBridge — first of each month
ScheduleExpression: cron(0 0 1 * ? *)
# (Note: AWS uses the Quartz 6-field form with '?' for day-of-week) 주요 기능
실시간 POSIX 5필드 파서
POSIX cron을 엄격히 따르는 파서: 분(0-59), 시(0-23), 일(1-31), 월(1-12 또는 JAN-DEC), 요일(0-6 또는 SUN-SAT, 7도 일요일로 허용). 모든 표준 연산자(`*` `,` `-` `/`)와 매크로(`@yearly` `@monthly` `@weekly` `@daily` `@hourly`)를 지원합니다.
다음 5회 실행 미리보기
현재 로컬 시각으로부터 다음 다섯 번의 예정 실행 시각을 계산합니다. 클릭 한 번으로 로컬과 UTC를 전환할 수 있어, 다른 지역의 서버에 crontab을 배포하기 전에 시간대 함정을 잡는 가장 확실한 방법입니다.
자연어 설명
유효한 모든 표현식에 사람이 읽을 수 있는 설명이 따라옵니다. "15분마다", "평일 오전 9시", "1월과 7월 매월 1일 02:30" 같은 식입니다. 코드 리뷰와 팀 인수인계가 한결 수월해집니다. `*/5 9-17 * * 1-5`가 실제로 무엇을 하는지 더 이상 추측할 필요가 없습니다.
필드 단위 오류 메시지
유효하지 않은 표현식은 문제가 있는 필드가 강조된 즉각적인 적색 피드백과 구체적인 오류를 받습니다. "Error in minute: value out of range [0, 59]: "60"" 같은 식입니다. 사흘 뒤 리포트가 실행되지 않은 것을 발견하는 침묵의 crontab 실패는 더 이상 없습니다.
자주 쓰는 스케줄 프리셋 칩
원클릭 프리셋 열한 개가 실제로 자주 쓰는 스케줄을 모두 담았습니다. 매분, 5분/15분마다, 매시간, 매일 자정 또는 오전 9시, 평일 오전 9시, 매주 일요일/월요일, 매월 1일, 매년 1회. 누르고, 다듬고, 배포하십시오.
필드별 빌더 입력
다섯 필드의 순서를 외울 필요가 없습니다. 분, 시, 일, 월, 요일이라고 라벨이 붙은 다섯 개의 작은 입력으로 값을 빠뜨리거나 순서를 잘못 두는 일 없이 한 번에 한 위치만 편집할 수 있습니다. 상단의 전체 표현식이 자동으로 다시 생성됩니다.
POSIX OR 의미 규칙을 제대로 처리
일과 요일이 모두 제한되면 OR 규칙이 발동합니다. `0 0 1 * 5`는 매월 1일 그리고 매주 금요일에 실행됩니다. 다음 실행 미리보기가 배포 전에 이를 가시화해 주말 페이지 호출이 갑자기 발생하는 일을 막아 줍니다.
100% 브라우저 기반 프라이버시
인프라 타이밍과 내부 스케줄링 패턴을 드러내는 경우가 많은 cron 표현식이 브라우저를 벗어나지 않습니다. 데이터가 어떤 서버로도 전송되지 않고, 로그도, 분석도 없습니다. 브라우저의 네트워크 탭에서 직접 확인할 수 있습니다. 운영 스케줄과 내부 시스템에도 안전합니다.
Quartz 인지형 오류 메시지
`?` `L` `W` `#`가 포함된 Quartz 표현식을 붙여넣으면 파서가 "Quartz operators not supported — use POSIX syntax"라고 설명해 줍니다. 침묵의 실패를 디버깅하는 대신 cron 용으로 다시 작성해야 함을 알 수 있습니다. Quartz 스케줄은 Linux cron에서 동작하지 않습니다.
cron 변종과 스케줄러
Vixie cron (Linux 기본)
5필드 POSIX대부분의 Linux 배포판 기본값. 명시적 시간대를 위한 `CRON_TZ=` 확장이 있는 엄격한 POSIX. 일·요일 OR 의미가 적용됩니다. 본 도구의 주된 대상입니다.
BSD cron
5필드 POSIXmacOS와 BSD 계열의 기본값. vixie cron과 사소한 구현 차이가 있는 POSIX 호환이며, 대부분의 표현식이 동일하게 동작합니다.
systemd 타이머 (OnCalendar)
calendar 명세, cron 아님systemd 기반 Linux에서 cron의 대안. `OnCalendar: 2026-*-* 09:00:00` 문법을 사용해 반복하지 않는 스케줄에 가독성이 좋지만 cron 표현식과 상호 운용되지는 않습니다.
Quartz Scheduler (Java/Spring)
6 또는 7 필드초(필수)와 연도(선택) 필드, 그리고 `?`, `L`, `W`, `#` 연산자를 추가합니다. Java 앱에 유용하지만 Linux cron으로 이식되지는 않습니다.
AWS EventBridge
`?`가 있는 6필드 Quartz 스타일둘 중 하나만 제한될 때 요일 또는 일에 `*`가 아닌 `?`(Quartz 관례)를 요구합니다. 표현식이 Linux cron으로 그대로 이식되지 않습니다.
Kubernetes CronJob
5필드 POSIX + timeZone 필드POSIX 5필드 스케줄에 `spec.timeZone` 필드(1.27+)가 더해집니다. kubelet 호스트의 시간대에 의존하는 것보다 깔끔합니다. 표현식은 Linux cron에서 그대로 이식됩니다.
GitHub Actions
5필드 POSIX언제나 UTC로 실행됩니다. 베스트 에포트 타이밍이라 부하 상황에서 건너뛸 수 있습니다. 15분보다 짧은 간격은 피하십시오. 표현식은 Linux cron에서 그대로 이식됩니다.
cron 표현식 예시
15분마다
*/15 * * * *
단계 연산자 `*/15`는 분 필드에서 "분 0부터 시작해 15분마다"를 의미합니다. 즉 매시간 :00, :15, :30, :45에 실행됩니다. API 폴링, 캐시 갱신, 헬스 체크에서 가장 흔히 쓰이는 간격입니다.
평일 오전 9시
0 9 * * 1-5
요일 필드의 범위 `1-5`는 월요일부터 금요일까지를 의미합니다(1=월, 5=금). 정확히 09:00에 실행됩니다. 업무 시간 리포트, 야간 데이터에 의존하는 배치 작업, 데일리 스탠드업 알림에 유용합니다.
매월 1일 자정
0 0 1 * *
일은 `1`, 더 낮은 필드는 모두 0입니다. 월간 청구, 로그 로테이션, 기간 마감 정산에 자주 쓰입니다. 일과 요일은 둘 다 `*`가 아닐 때만 동시에 제한되는데, 여기서는 요일이 `*`이므로 일 필드만 작동합니다.
평일 오전 9시-오후 5시, 5분마다
*/5 9-17 * * 1-5
서로 다른 필드에서 단계(`*/5`)와 범위(`9-17`)를 조합합니다. 업무 시간 한정 모니터링이나 큐 비우기 작업에 유용합니다. 합계: 시간당 12회 × 9시간 × 5일 = 주당 540회 실행입니다.
분기별: 1, 4, 7, 10월 1일 자정
0 0 1 JAN,APR,JUL,OCT *
쉼표로 구분된 목록에 월 이름을 넣었습니다. 재무 결산, 코드 프리즈 리뷰, 컴플라이언스 감사 같은 분기 스케줄에 적합합니다. 이름과 숫자를 섞을 수 있지만(`1,APR,7,10`도 동일하게 파싱됨) 가독성을 위해 하나의 스타일로 통일하는 편이 좋습니다.
POSIX OR 함정: 매월 1일 OR 매주 금요일
0 0 1 * 5
일(`1`)과 요일(`5`)이 모두 제한되면 POSIX cron은 둘 중 어느 한쪽이 일치할 때 작업을 실행합니다. 따라서 이 표현식은 매월 1일 그리고 매주 금요일에 실행되는 것이지 1일에 해당하는 금요일에만 실행되는 것이 아닙니다. 가장 흔한 cron 함정이며, 다음 실행 미리보기로 즉시 확인할 수 있습니다.
매일 02:30 (트래픽이 적은 시간대)
30 2 * * *
시와 분에 구체적인 값을 지정하고 나머지는 와일드카드입니다. 02:00-04:00 UTC 구간은 야간 배치 작업의 사실상 표준 시간대인데, 어떤 주요 비즈니스 권역의 업무 시간과도 겹치지 않기 때문입니다. UTC 시간대 토글과 함께 사용해 실제 실행 시각이 의도한 곳에 떨어지는지 확인하십시오.
매크로 등가: @daily
@daily
`@daily` 단축 표기(그리고 `@midnight`)는 `0 0 * * *`로 확장됩니다. 매일 자정에 실행됩니다. 다른 매크로: `@yearly` = `0 0 1 1 *`, `@monthly` = `0 0 1 * *`, `@weekly` = `0 0 * * 0`, `@hourly` = `0 * * * *`. 매크로는 간결하지만 다섯 필드 형식이 스케줄러 간 이식성이 더 좋습니다(매크로를 지원하지 않는 스케줄러도 있습니다).
cron 표현식 만드는 방법
- 1
cron 표현식을 입력하거나 붙여넣기
상단 입력란에 다섯 필드 cron 표현식(예: `*/15 * * * *`)을 입력하십시오. 본 도구는 입력하는 동안 파싱과 검증을 수행합니다. 유효하면 녹색 체크, 유효하지 않으면 필드 이름이 표시된 적색 오류가 나타납니다. `@daily`, `@hourly` 등의 매크로도 받아들입니다.
- 2
또는 다섯 필드 입력을 조정
필드 순서를 외울 필요가 없습니다. 라벨이 붙은 입력으로 분, 시, 일, 월, 요일을 개별적으로 편집할 수 있습니다. 상단의 전체 표현식이 자동으로 갱신됩니다. 와일드카드에는 `*`, 단계에는 `*/N`, 범위에는 `a-b`, 목록에는 `1,3,5`를 사용하십시오.
- 3
프리셋으로 출발점 잡기
프리셋 칩(15분마다, 평일 오전 9시 등)을 눌러 자주 쓰는 스케줄을 불러온 뒤 필요에 맞게 필드를 다듬으십시오. 열한 개의 프리셋이 실제 운영에서 쓰는 패턴을 모두 다룹니다.
- 4
다음 실행 미리보기 확인
예정된 다섯 개의 실행 날짜·시간을 보십시오. 로컬과 UTC를 전환해 의도한 시각에 스케줄이 실행되는지 확인하십시오. POSIX의 일·요일 OR 함정이 운영에서 문제를 일으키기 전에 잡아내는 가장 확실한 방법입니다.
- 5
복사해 스케줄러에 붙여넣기
복사를 눌러 표현식을 클립보드에 담으십시오. crontab, systemd 타이머, GitHub Actions `cron:`, AWS EventBridge, Kubernetes CronJob `schedule` 또는 cron 호환 스케줄러에 붙여넣을 수 있습니다. 대상 스케줄러의 시간대도 잊지 말고 확인하십시오. 아래 모범 사례 섹션을 참고하십시오.
흔한 cron 실수
POSIX OR 함정: 두 일 필드 모두 제한
일과 요일이 모두 제한되면 POSIX cron은 둘 중 어느 한쪽이 일치할 때 작업을 실행합니다(둘 다 일치할 때가 아닙니다). 따라서 `0 0 1 * 5`는 매월 1일 그리고 매주 금요일에 실행되는 것이지 1일에 해당하는 금요일에만 실행되는 것이 아닙니다. 단일 조건을 원한다면 두 일 필드 중 하나에 `*`를 사용하거나 AND 검사를 수행하는 래퍼 스크립트를 작성하십시오.
# 의도: "매월 첫째 금요일" 0 0 1-7 * 5 # 실제: 매월 1-7일 OR 매주 금요일 — 두 조건 모두
# 진짜 AND 의미를 위해 래퍼 사용 0 0 * * 5 [ $(date +\%d) -le 7 ] && /your-script # 또는 한 조건을 떨어내고 더 느슨한 스케줄을 수용
개발과 운영 사이의 시간대 드리프트
Linux 서버의 cron 스케줄은 작성자의 로컬 시간대가 아닌 시스템 시간대를 사용합니다. UTC로 설정된 서버에서 오전 9시 cron은 미국 동부 시간 오전 4시에 실행됩니다. 언제나 대상 서버의 시간대 — 가능하면 UTC — 를 기준으로 스케줄을 설계하고, crontab 상단에 `CRON_TZ=...`로 시간대를 명시적으로 고정하십시오.
# 미국 동부 개발자가 작성, UTC 서버에 배포 0 9 * * * /your-report.sh # 오전 9시 UTC = 미국 동부 오전 4시에 실행 — 개발자의 의도와 다름
# 시간대 고정, 또는 명시적으로 UTC로 작성 CRON_TZ=America/New_York 0 9 * * * /your-report.sh
단계 연산자 혼동: '*/15' vs '15'
분에서 `*/15`는 "0부터 시작해 15분마다"(즉 0, 15, 30, 45)를 의미합니다. 단순한 `15`는 "분 15에만"으로 시간당 한 번 실행입니다. 초보자는 15분마다라고 생각하고 `15`를 쓰는 경우가 잦은데, 배포 전에 본 도구의 자연어 설명이 이를 드러내 줍니다.
# 의도: 15분마다 15 * * * * # 실제: 매시간 분 15에 한 번 (의도보다 시간당 4회 적음)
# 올바른 표현 */15 * * * * # 15분마다: 매시간 분 0, 15, 30, 45
POSIX 스케줄러에 6필드 표현식
Quartz/Spring/node-cron은 첫 위치에 선택적 초 필드를 지원합니다. Linux crontab, GitHub Actions, AWS EventBridge(대체로), Kubernetes CronJob은 그렇지 않으며 다섯 필드를 기대합니다. 6필드 표현식을 붙여넣으면 스케줄이 조용히 깨집니다. 초가 분이 되고, 분이 시가 되는 식으로 밀려납니다.
# Linux crontab에 복사된 Quartz 6필드 0 0 9 * * 1-5 # Linux 해석: 분=0, 시=0, 일=9, 월=*, 요일=1-5 # = 평일과 일치하는 월의 9일 자정 — 혼돈
# POSIX 5필드, 초 떨어내기 0 9 * * 1-5 # = 평일 오전 9시
월의 범위를 벗어난 일
cron은 일을 실제 월에 대해 검증하지 않습니다. `0 0 31 2 *`(2월 31일)은 정상적으로 파싱되지만 절대 일치하지 않습니다. 2월은 길어야 29일입니다. 초보자는 파서가 이를 잡아 줄 것이라고 가정하지만 그렇지 않습니다. 본 도구의 다음 실행 미리보기는 표현식이 구조적으로 유효하지만 논리적으로 불가능할 때 "예정된 실행 없음"을 표시합니다.
# 2월 30일 또는 31일 — 절대 실행되지 않음 0 0 30 2 * 0 0 31 2 * # 파싱되지만 어떤 스케줄도 실행되지 않음
# 스크립트로 '2월 마지막 평일' 패턴 구현 0 0 28-29 2 * [ $(date -d tomorrow +\%m) = 03 ] && /your-script
Quartz 문법을 POSIX로 착각
AWS 문서, Spring 튜토리얼, 많은 Stack Overflow 답변은 `?`, `L`, `W`, `#`이 포함된 Quartz cron 표현식을 보여 줍니다. 이들은 Linux crontab에서 동작하지 않습니다. 요일 슬롯에 `?`가 있는 6필드 표현식을 복사하면 Linux 파서는 거부하거나, 더 나쁘게는 조용히 잘못 파싱합니다. 본 도구는 Quartz 연산자를 잡아내 그 차이를 설명해 줍니다.
# Quartz: '월의 마지막 금요일' — POSIX에서 유효하지 않음 0 0 ? * 6L *
# 마지막 금요일에 대한 POSIX 래퍼 스크립트 방식 0 0 25-31 * 5 /your-script # 어느 월이든 25-31일 사이의 금요일에 실행
일반 활용 사례
- Linux crontab 작업
- `/etc/crontab`, `/etc/cron.d/*`, 또는 사용자별 `crontab -e` 파일의 항목을 만들고 검증합니다. 저장 전에 다음 실행 미리보기로 스케줄이 서버의 구성된 시간대 기준으로 올바른 시각에 떨어지는지 확인하십시오.
- Kubernetes CronJob 스케줄
- Kubernetes CronJob의 `spec.schedule` 필드를 생성합니다. Kubernetes 1.27+는 `spec.timeZone`도 지원합니다. UTC 토글로 UTC 기준으로 스케줄을 설계한 뒤 `timeZone`을 명시적으로 설정해 워커 노드의 로컬 시간을 피하십시오.
- GitHub Actions 예약 워크플로
- `on.schedule` 아래 `cron:` 항목을 만듭니다. GitHub Actions는 언제나 UTC로 실행됩니다. 미리보기를 UTC로 토글해 스케줄을 확인하십시오. 15분보다 짧은 간격은 피하십시오. GitHub 스케줄러는 부하 상황에서 짧은 간격 작업을 자주 건너뜁니다.
- AWS EventBridge 규칙
- EventBridge 예약 규칙용 cron 표현식을 구성합니다. 참고: AWS는 요일에 `?`를 쓰는 Quartz 스타일 6필드 문법을 사용합니다. 본 도구는 POSIX 5필드를 생성하므로 초(`0`)를 앞에 붙이고 두 일 필드 중 하나의 `*`를 `?`로 바꿔야 합니다.
- GitLab CI 예약 파이프라인
- GitLab의 예약 CI 파이프라인용 cron 표현식을 확인합니다. GitLab은 본 도구가 생성하는 POSIX 5필드 문법과 UI 날짜 선택기를 사용하지만, 비표준 간격에 더 세밀한 제어가 필요할 때는 cron 형식이 유리합니다.
- Cloudflare Workers Cron Triggers
- `wrangler.toml`의 `[triggers.crons]` 항목을 만듭니다. Cloudflare는 POSIX 5필드 문법을 사용합니다. 최소 간격은 1분이며 워커는 UTC로 실행됩니다. 트리거가 예상한 시간 창 안에 실행되는지 미리보기로 확인하십시오.
- Node.js node-cron 스케줄
- 다섯 필드 POSIX와 선택적 선두 초 필드를 모두 지원하는 `node-cron` 라이브러리용 표현식을 만듭니다. 1분 미만 정밀도가 꼭 필요한 경우가 아니라면 다섯 필드를 사용하십시오. 6필드 표현식은 Linux crontab으로 이식되지 않습니다.
- 코드 리뷰와 문서화
- PR이나 런북의 cron 표현식을 붙여넣어 무엇을 하는지 즉시 확인하십시오. 더 이상 `30 7 * * 1-5`를 추측하거나 참조 카드를 꺼낼 필요가 없습니다. 자연어 설명은 인라인 주석이나 README 파일에도 적합합니다.
cron 문법 참조
- 필드 순서: M H D M W
- 분(0-59), 시(0-23), 일(1-31), 월(1-12), 요일(0-6, 7도 일요일). 요일 필드는 숫자(0-6)와 이름(SUN-SAT, 대소문자 무시) 토큰을 모두 받습니다.
- 연산자
- `*` = 임의의 값; `,` = 목록 구분자(`1,3,5`); `-` = 범위(`1-5`); `/` = 단계(`*/15`, `5/10`); 이름: 월은 JAN-DEC, 요일은 SUN-SAT(대소문자 무시).
- 매크로(별칭)
- `@yearly` = `0 0 1 1 *`; `@annually` = `0 0 1 1 *`; `@monthly` = `0 0 1 * *`; `@weekly` = `0 0 * * 0`; `@daily` = `0 0 * * *`; `@midnight` = `0 0 * * *`; `@hourly` = `0 * * * *`. `@reboot`는 특수한 비스케줄(부팅 시에만 실행)이며 설명과 함께 거부됩니다.
- POSIX 일 의미 규칙 (OR 규칙)
- 일과 요일이 모두 제한되면(둘 다 `*`가 아니면) 스케줄은 둘 중 어느 한쪽이 일치할 때 실행됩니다 — OR 의미입니다. 하나만 제한되면 그 하나가 결정합니다. 둘 다 `*`면 매일 일치합니다. 이 OR 규칙은 vixie cron, BSD cron, 대부분의 POSIX 구현에 적용됩니다. Quartz는 AND와 OR를 구분하기 위해 `?`를 사용합니다.
- 6필드 모드(Quartz-Lite)
- 입력에 여섯 개의 공백 구분 토큰이 있으면 본 도구는 첫 번째를 초 필드(0-59)로 처리합니다. Quartz, Spring `@Scheduled(cron=...)`, node-cron에 유용합니다. Linux crontab이나 POSIX 스케줄러로는 이식되지 않습니다. 이들은 사용자의 초를 분으로 취급해 모든 위치를 한 칸씩 밀어 버립니다.
- 단계 연산자 고정
- `*/N`은 필드의 가장 낮은 값에 고정됩니다. 분에서 `*/15` = `0,15,30,45`이지 "지금부터 15마다"가 아닙니다. 와일드카드가 아닌 기준을 쓰면: 분에서 `5/15` = `5,20,35,50`. 필드 범위를 정수로 나누지 못하는 단계 값은 끝에서 다시 시작하는 지점 근처에서 건너뜁니다. 정상 동작이며 버그가 아닙니다.
- 검증 경계
- 분 ∈ [0,59], 시 ∈ [0,23], 일 ∈ [1,31], 월 ∈ [1,12], 요일 ∈ [0,7]. 범위를 벗어난 값은 필드 단위 오류를 일으킵니다. 일은 월에 대해 검증되지 않습니다(`0 0 31 2 *`는 정상적으로 파싱되지만 2월에는 31일이 없으므로 절대 일치하지 않으며, 다음 실행 미리보기는 "예정된 실행 없음"을 표시합니다).
- Quartz 연산자 거부
- POSIX cron은 Quartz의 `?`(특정 값 없음), `L`(last), `W`(가장 가까운 평일), `#`(n번째 요일)을 지원하지 않습니다. 본 도구는 이들을 "Quartz operators not supported"라는 명확한 메시지와 함께 거부합니다. 잘못된 POSIX로 침묵 파싱하지 않습니다. Quartz 스케줄에는 Quartz 인지형 도구나 Spring 스케줄러를 대신 쓰십시오.
- 다음 실행 탐색의 연도 상한
- 다음 실행 계산은 앞으로 최대 4년까지 탐색합니다. 그보다 드물게 일치하는 표현식(예: "2월 29일" 패턴)은 "향후 4년 이내에 예정된 실행 없음"으로 표시됩니다. 불가능한 패턴에서 무한 반복을 피하기 위한 의도된 설계입니다.
cron 스케줄 모범 사례
- 서버는 UTC로, 표시할 때 변환하라
- 서버를 UTC로 설정하고(`/etc/timezone` 또는 `TZ=UTC`) 모든 cron 표현식을 UTC로 작성하십시오. 로컬 시간으로의 변환은 대시보드와 리포트에서 표시 시점에만 수행합니다. 이렇게 하면 시간대 버그의 한 부류를 통째로 제거할 수 있는데, 특히 일광 절약 시간 전환에서 로컬 시간 스케줄이 조용히 두 번 실행되거나 한 번을 건너뛰는 상황을 막아 줍니다. 본 도구의 UTC 토글로 처음부터 UTC 기준으로 스케줄을 설계하십시오.
- POSIX 일/요일 OR 함정을 피하라
- OR 의미를 원하지 않는다면 일과 요일을 둘 다 제한하지 마십시오. "1월의 매주 월요일"을 원한다면 `0 0 * 1 1`(일은 `*`)로 작성하고, "매월 1일"을 원한다면 `0 0 1 * *`(요일은 `*`)로 작성하십시오. POSIX OR 규칙 때문에 `0 0 1 * 1`은 매월 1일 그리고 매주 월요일에 실행되는데, 의도와 거의 다를 것입니다. 배포 전에 다음 실행 미리보기를 확인하면 이 문제를 잡아낼 수 있습니다.
- 스케줄 시간대를 명시적으로 고정하라
- 최근의 스케줄러는 스케줄 정의에서 시간대 고정을 지원합니다. vixie cron 3.0+에서는 crontab 상단에 `CRON_TZ=America/New_York`을, Kubernetes CronJobs 1.27+에서는 `spec.timeZone: "America/New_York"`을, AWS EventBridge Scheduler에서는 스케줄 표현식에 `ScheduleExpressionTimezone`을 사용합니다. 서버의 기본값에 의존하지 말고 시간대를 명시적으로 고정하십시오. 서버 시간대는 인프라 마이그레이션 중에 예고 없이 바뀔 수 있습니다.
- :00이 아니라 여러 분에 부하를 분산하라
- 중요하지 않은 작업에 `0 * * * *`(매시간 분 0)는 피하십시오. 규모가 커지면 많은 작업을 정확히 :00에 예약하는 것이 부하 스파이크를 일으킵니다. 각 작업마다 임의의 분 오프셋(`23 * * * *`, `41 * * * *`)을 골라 부하를 분산하십시오. 일간 작업도 마찬가지입니다. `30 3 * * *`는 많은 작업이 3:00에 몰릴 때 `0 3 * * *`보다 데이터베이스에 친화적입니다.
- 작업을 멱등하게 설계하라
- cron에는 내장된 재시도, 중복 실행 방지, 놓친 실행 복구 기능이 없습니다. 작업은 여러 번 실행되어도 안전하도록(멱등하도록) 그리고 스스로 상태를 점검하도록 설계해야 합니다. "오전 9시에 리포트를 보냄" 대신 "오늘 리포트가 아직 발송되지 않았다면 발송"으로 설계하십시오. 이렇게 하면 다운타임, 우발적 중복 스케줄, 동시 실행 이후에도 스스로 복구됩니다. 멱등성은 스케줄러가 아니라 작업의 속성이며, 가장 중요한 신뢰성 관행입니다.
- 중요한 스케줄에는 하트비트를 추가하라
- cron의 침묵 실패 모드가 가장 큰 약점입니다. 스케줄이 실행되지 않아도 아무도 알려 주지 않습니다. 중요한 작업이라면 실행이 끝날 때마다 하트비트 서비스(Healthchecks.io, Cronitor, Dead Man's Snitch)에 핑을 보내고, 예상한 핑이 도착하지 않으면 서비스가 알림을 발송하도록 하십시오. 작업 실패와 스케줄 자체의 오작동을 모두 잡을 수 있습니다. 무료 플랜으로도 개인과 소규모 팀의 요구 대부분을 충당할 수 있습니다.
- 배포 전에 다음 실행 미리보기로 확인하라
- 새 cron 스케줄을 배포하기 전에 본 도구의 미리보기에 표시된 다섯 개의 예정 실행 날짜·시간을 살펴보십시오. 로컬과 UTC를 토글하십시오. 의도한 시각에 스케줄이 떨어지는지 확인하십시오. 5분 일찍 실행되거나 잘못된 요일에 실행되거나 신경 쓰던 주말을 건너뛰지 않는지 점검하십시오. 미리보기는 가장 저렴한 운영 테스트입니다.
자주 묻는 질문
이 도구는 무엇을 하나요?
cron 표현식은 무엇인가요?
내 데이터가 어딘가로 업로드되나요?
POSIX cron과 Quartz의 차이는 무엇인가요?
왜 '0 0 1 * 5'가 매주 금요일 그리고 매월 1일에 실행되나요?
30초마다 작업을 실행하려면 어떻게 하나요?
cron은 어떤 시간대를 사용하나요?
'*/15'는 실제로 무엇으로 확장되나요?
초가 포함된 6필드 표현식을 쓸 수 있나요?
cron이 표현할 수 있는 최대 간격은 얼마인가요?
다운타임 이후 놓친 실행은 어떻게 처리하나요?
GitHub Actions cron이 왜 정시에 실행되지 않나요?
관련 도구
모든 도구 보기 →Unix 타임스탬프 & 에폭 변환기 · 다중 정밀도
날짜 & 시간
Unix 타임스탬프를 날짜로 즉시 변환합니다. 초, 밀리초, 마이크로초를 자동 감지하며 실시간 시계와 양방향 변환을 온라인에서 무료로 제공합니다.
진법 변환기 (Number Base Converter)
변환 도구
2진수, 16진수, 10진수, 8진수 및 임의 진법(2-36)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.
Base64 디코더 · 인코더 (Base64 Decoder & Encoder)
인코딩 & 포매팅
Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.
CSV to JSON 변환기 (CSV to JSON Converter)
인코딩 & 포매팅
브라우저에서 CSV를 JSON으로 변환합니다. RFC 4180, 타입 추론, 헤더 행, 큰 정수 안전 처리. 100% 비공개, 업로드 없음.
이미지 압축기 · JPEG, PNG, WebP 온라인 압축
변환 도구
JPEG, PNG, WebP 이미지를 온라인에서 최대 80% 압축합니다. 브라우저 안에서만 처리되며 업로드 없이 20장 일괄 처리, 품질 조절, 전후 비교를 무료로 지원합니다.
JSON Diff 비교
인코딩 & 포매팅
두 JSON 파일을 브라우저에서 즉시 Diff 비교하세요. 나란히 보기 하이라이팅, RFC 6902 JSON Patch 출력, 타임스탬프·ID 같은 노이즈 필드 무시. 비공개, 업로드 없음.