cron 표현식 읽는 법: 다섯 개 필드를 하나씩 해석하기
cron 표현식은 작업을 언제 실행할지 알려 주는 짧은 한 줄의 텍스트예요. 보통 공백으로 구분된 다섯 개 필드로 이루어져요. 분, 시, 일, 월, 요일 순서예요. 0 9 * * 1-5 줄은 월요일부터 금요일까지 오전 9시를 뜻해요. 각 필드는 숫자, 이름, 목록, 범위, 간격 중 하나이거나, 모든 값을 뜻하는 *이에요. 모든 필드가 맞는 시점마다 작업이 실행돼요.
다섯 개 필드
| 필드 | 허용 값 | 예시 |
|---|---|---|
| 분 | 0~59 | 30은 매시 30분이에요 |
| 시 | 0~23 | 9는 24시간제로 09:00이에요 |
| 일 | 1~31 | 15는 15일이에요 |
| 월 | 1~12, 또는 JAN~DEC | 3 또는 MAR은 3월이에요 |
| 요일 | 0~6, 또는 SUN~SAT | 0 또는 SUN은 일요일, 1은 월요일이에요 |
일부 시스템은 일요일을 7로도 받아들이지만 모든 시스템이 그렇지는 않으니, 0 또는 SUN을 쓰세요. 이 형식의 cron에는 초 필드가 없어서 가장 작은 간격은 1분이에요.
목록, 범위, 간격, 이름
는 해당 필드의 모든 값을 뜻해요.* * * *은 1분마다 실행돼요.- 목록은 쉼표를 써요.
0 9,17 * * *은 매일 09:00과 17:00에 실행돼요. - 범위는 하이픈을 써요. 요일 필드의
1-5는 월요일부터 금요일까지를 뜻해요. - 간격은 슬래시를 써요. 분 필드의
*/15는 0, 15, 30, 45분을 뜻해요.10-30/5는 10, 15, 20, 25, 30분을 뜻해요. MON-FRI같은 이름을 숫자 대신 쓸 수 있어요. 스케줄러가 받아들인다면 읽기가 더 쉬워요.
이 부분들은 함께 조합할 수 있어요. 0 8-18/2 * * *은 08:00부터 18:00까지 두 시간마다 정각에 실행돼요.
자주 쓰는 일정
| 표현식 | 의미 |
|---|---|
* * * * * | 1분마다 |
/15 * * * | 15분마다 |
0 * * * * | 매시 정각 |
0 2 * * * | 매일 02:00 |
0 9 * * 1-5 | 월요일~금요일 09:00 |
0 9,17 * * * | 매일 09:00과 17:00 |
30 6 1 * * | 매월 1일 06:30 |
0 0 * * 0 | 매주 일요일 자정 |
0 0 1 1 * | 1월 1일 자정 |
/5 9-17 * 1-5 | 월요일~금요일 09:00부터 17:55까지 5분마다 |
0 0 * * 은 자정, 0 12 * *은 정오라는 점을 기억하세요. 시각을 잘못 적는 것이 가장 흔한 실수 중 하나예요.
일과 요일
일 필드와 요일 필드를 둘 다 제한하면, 두 필드 중 하나라도 맞을 때 작업이 실행돼요. Vixie cron과 그에서 파생된 많은 시스템의 고전적인 규칙이에요. 그래서 0 0 13 * 5은 매월 13일 자정에도, 매주 금요일에도 실행돼요. 사람들은 보통 13일이 금요일인 날에만 실행되기를 기대하지만, 계획보다 더 많이 실행되는 결과가 나와요.
두 필드 중 하나가 *이면, 나머지 필드만 적용돼요. 13일이 금요일인 날에만 실행하려면, 모든 금요일에 작업을 등록한 뒤 스크립트 안에서 날짜를 확인하세요. 일부 클라우드 서비스를 포함한 다른 스케줄러는 다른 규칙을 쓸 수 있으니, 해당 문서를 확인하세요.
시간대와 일광 절약 시간
cron은 실행되는 기계나 서비스의 시계, 보통은 그 기계의 현지 시간대를 기준으로 실행돼요. 02:30으로 설정한 작업은 그 시계의 02:30에 실행돼요. 먼저 시간대를 확인하세요(리눅스에서는 date로 볼 수 있어요). 모든 곳에서 같은 시계를 따르게 하려면, 많은 팀이 서버를 UTC로 운영하고, 일부 스케줄러는 작업마다 시간대를 지정할 수 있게 해 줘요.
일광 절약 시간제는 1년에 두 번 시계를 바꿔요. 봄에는 많은 지역이 02:00에서 바로 03:00으로 넘어가서, 02:30 작업은 실행될 시간이 없어요. 가을에는 01:00부터 01:59까지의 한 시간이 두 번 나와요. 스케줄러마다 이런 경우를 다르게 처리해요. 작업을 건너뛰는 경우도 있고, 한 번만 실행하는 경우도 있고, 두 번 실행하는 경우도 있어요. 차이가 중요하다면, 이 시각 변경 구간을 피해 작업을 잡거나 UTC를 쓰세요.
여섯 개 필드와 Quartz
일부 스케줄러는 맨 앞에 초 필드를 추가해요. 그래서 /10 * * * *은 10초마다 실행돼요. 자바용 Quartz 스케줄러는 초, 분, 시, 일, 월, 요일, 그리고 선택적 연도를 쓰고, 특수 문자 네 개를 추가로 써요.
?는 "특정 값 없음"을 뜻해요. Quartz는 일 필드나 요일 필드 중 설정하지 않은 쪽에 이 값을 반드시 써야 해요.L은 마지막을 뜻해요. 일 필드의L은 그 달의 마지막 날이고, 요일 필드의6L은 마지막 금요일이에요.W는 가장 가까운 평일을 뜻해요.15W는 15일에 가장 가까운 평일이며, 다른 달로 넘어가지 않아요.#는 몇 번째 요일인지를 뜻해요.6#3은 세 번째 금요일이에요.
Quartz는 다섯 필드 형식과 요일 번호가 달라요. Quartz의 1은 일요일, 7은 토요일이에요. 그래서 월요일부터 금요일까지는 1-5가 아니라 2-6이에요. 줄을 복사하기 전에 스케줄러가 어떤 형식을 쓰는지 꼭 확인하세요.
자주 하는 실수
- 분 필드의
*/7. 값은 0, 7, 14 … 56까지예요. 다음은 63인데 그런 분은 없으니, 56분 다음 실행은 다음 시각의 0분이에요. 간격은 4분밖에 안 되고, 간격도 고르지 않아요. 5, 10, 15, 30처럼 60을 나누어떨어지는 간격을 쓰세요. - 2월 30일. 그런 날짜는 없으니
0 0 30 2 *은 절대 실행되지 않아요. 30일까지만 있는 달의 31일도 마찬가지예요. 두 필드 중 하나라도 맞으면 실행되는 규칙 때문에, 요일 제한이 있으면 다른 날에 실행될 수도 있으니 결과를 꼭 확인하세요. - 24시 또는 60분. 범위를 벗어난 값이에요. 대부분의 스케줄러는 저장할 때 거부하지만, 전부 그렇지는 않아요.
- 초를 기대하는 것. 다섯 필드 형식의 줄은 정각 분 단위로만 실행돼요.
- cron과 정규 표현식 혼동. cron에서
는 모든 값을 뜻해요. 정규 표현식에서는 앞의 항목을 반복한다는 뜻이에요. 패턴은 정규식 테스터로 확인하고, cron 줄과는 구분해서 쓰세요.
다음 실행 시각 확인하기
일정을 믿고 쓰기 전에, 줄을 평범한 말로 풀어 읽고 다음 실행 시각을 몇 개 적어 보세요. cron 표현식 해석기가 이 두 가지를 모두 해 주니, 일 과 요일의 OR 규칙이나 이상한 간격을 놓치지 않는 가장 빠른 방법이에요.
빠른 답변
첫 번째 필드는 분인가요, 초인가요?
표준 다섯 필드 형식에서는 분이에요. 여섯 필드를 쓰는 일부 스케줄러만 초를 추가하며, 이때 초는 맨 앞에 와요.
왜 제 작업이 금요일에도, 13일에도 실행되나요?
일 필드와 요일 필드가 둘 다 설정되어 있어서, 둘 중 하나라도 맞으면 작업이 실행돼요. 다른 한쪽만 적용하고 싶다면 그 필드를 *로 바꾸세요.
cron은 UTC를 쓰나요?
기계나 서비스가 UTC로 설정되어 있을 때만 그래요. 그렇지 않으면 그 시스템의 현지 시간대를 써요.
AI 도움을 받아 영어 원문에서 번역했어요.
댓글
아직 댓글이 없어요. 첫 댓글을 남겨 보세요.


