필드 순서와 범위
표준 crontab은 왼쪽부터 분(0–59) 시(0–23) 일(1–31) 월(1–12) 요일(0–7) 다섯 필드입니다. Spring, Quartz, 일부 클라우드 스케줄러는 맨 앞에 초(0–59)를 둔 6필드를 씁니다. 이 도구는 개수로 구분합니다. 각 필드에는 *(전체), 숫자, 범위 1-5, 목록 1,15, 간격 */10, 범위+간격 0-30/5를 쓸 수 있고, 월과 요일은 JAN, MON 같은 영문 약자도 됩니다. 계산은 브라우저에서만 이루어집니다.
요일의 0과 7은 둘 다 일요일
요일은 0=일요일부터 6=토요일인데, 많은 구현이 7도 일요일로 받아들입니다. 그래서 1-5가 평일, 0,6 또는 6,7이 주말입니다. 주의할 점은 5-7처럼 7을 범위 끝에 쓰는 표현이 구현마다 다르게 해석될 수 있다는 것입니다. 안전하게는 0,5,6처럼 목록으로 적는 편이 좋습니다. 또 일(day of month)과 요일을 동시에 지정하면 표준 cron은 둘 중 하나만 맞아도 실행합니다(OR 조건). "매월 13일 중 금요일"을 원했다면 crontab으로는 표현할 수 없고 스크립트 안에서 걸러야 합니다.
자주 쓰는 표현
| 표현식 | 뜻 |
|---|---|
* * * * * | 매분 |
*/5 * * * * | 5분마다 |
0 * * * * | 매시 정각 |
30 9 * * 1-5 | 평일 오전 9시 30분 |
0 0 * * * | 매일 자정 |
0 3 * * 0 | 매주 일요일 새벽 3시 |
0 9 1 * * | 매월 1일 오전 9시 |
0 9 1 1,7 * | 1월·7월 1일 오전 9시 |
0 0 1 1 * | 매년 1월 1일 자정 (@yearly) |
0 */2 * * * | 2시간마다 정각 |
0 9-18 * * 1-5 | 평일 9시부터 18시까지 매시 정각 |
*/30 * * * * * | (6필드) 30초마다 |
시간대는 cron을 돌리는 서버 기준
cron은 시스템(또는 컨테이너)의 시간대로 동작합니다. 이 도구는 한국 시간(KST, UTC+9)으로 다음 실행 시각을 계산하므로, 서버가 UTC라면 9시간을 빼서 적어야 합니다. 한국 시간 오전 9시는 UTC 0 0 * * *입니다. 클라우드 관리형 스케줄러(AWS EventBridge, GitHub Actions 등)는 대부분 UTC 고정이라 이 실수가 잦습니다. 한국은 서머타임이 없어 연중 동일하지만, 서머타임이 있는 지역 시간대로 도는 서버는 전환일에 한 번 건너뛰거나 두 번 돌 수 있습니다.
*/N 간격의 함정
*/7 * * * *은 "7분마다"가 아니라 "0, 7, 14, …, 56분"에 실행되고 다음 정각에 0분부터 다시 시작합니다. 56분 다음이 다음 시 0분이므로 간격이 4분으로 줄어듭니다. 60의 약수(1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30)가 아닌 간격은 균일하지 않습니다. 일 필드의 */10도 1, 11, 21, 31일이라 달마다 고르지 않습니다. 다음 실행 시각 목록의 간격 표시로 이런 불균일을 확인할 수 있습니다.
지원하지 않는 문법
Quartz의 L(마지막 날), W(가장 가까운 평일), #(N번째 요일), ?는 표준 crontab에 없으며 이 도구도 해석하지 않습니다. 연도 필드(7필드)도 마찬가지입니다.
자주 묻는 질문
"매월 마지막 날"은 어떻게 적나요?
표준 cron으로는 직접 표현할 수 없습니다. 28-31일에 매일 돌리고 스크립트 안에서 내일이 1일인지 확인하는 방법이 일반적입니다.
다음 실행 시각이 실제 서버와 달라요.
서버 시간대가 KST가 아닐 가능성이 큽니다. date 명령이나 TZ 환경변수로 서버 시간대를 확인하세요. 또한 cron은 분 단위로만 동작하므로 초 필드가 있는 표현식은 crontab에서는 쓸 수 없습니다.
@daily 같은 단축어도 되나요?
네. @yearly, @monthly, @weekly, @daily, @hourly를 표준 5필드로 바꿔 해석합니다. @reboot은 시각이 아니므로 지원하지 않습니다.