Cron 표현식 파서·크론탭 빌더

Cron 표현식 해석과 크론탭 만들기

Cron 표현식 해석과 크론탭 만들기

예시로 채우기

설명

위에 cron 표현식을 입력하면 설명과 다음 실행 시각이 여기에 표시됩니다.

필드 분해

다음 실행 시각 (로컬 시간 기준)

    Cron 표현식 파서·크론탭 빌더 소개

    이 도구는 표준 5필드 Unix cron(분 시 일 월 요일)을 읽어 문장으로 풀어 주고, 다음 실행 시각을 실제로 한 분씩 넘겨 가며 찾아 보여 줍니다. 「빌더」 탭에서는 반대로 빈도·시각·요일을 골라 표현식을 만들고, 만든 결과를 같은 규칙으로 다시 검산합니다.

    cron 한 줄은 짧지만 틀리는 지점은 대개 문법이 아니라 해석입니다. 일(day-of-month)과 요일을 같이 적으면 AND가 아니라 OR이 되고, 같은 표현식이 서버 시간대에 따라 9시간씩 밀리고, Spring·Quartz용 표현식은 필드가 하나 더 많습니다. 아래는 이런 차이를 실제 예시로 다룹니다.

    일과 요일을 둘 다 적으면 OR이 된다

    0 9 1 * 1을 「매월 1일이 월요일일 때 9시」로 읽기 쉽지만 POSIX crontab 규격은 반대로 정합니다. 일 필드와 요일 필드가 둘 다 *가 아니면, 둘 중 하나만 맞아도 실행합니다. 그래서 이 줄은 「매월 1일 9시, 그리고 매주 월요일 9시」입니다. 한쪽이 *이면 그 필드는 조건에서 빠지므로 평소 직관대로 동작합니다.

    이 도구의 다음 실행 계산도 같은 규칙을 따릅니다. 원본이 정확히 *인지를 따로 기억해 두었다가, 둘 다 제한된 경우에만 OR로 판정합니다. 「매월 첫째 월요일」처럼 교집합이 필요하면 표준 cron으로는 표현할 수 없으므로 0 9 1-7 * *로 돌리고 스크립트 안에서 요일을 검사하는 방식이 흔히 쓰입니다(1~7일 중 월요일은 정확히 한 번).

    시간대: 같은 줄이 서버마다 다른 시각에 돈다

    cron 표현식에는 시간대 정보가 없습니다. 리눅스 cron은 그 머신의 로컬 시간(보통 TZ 설정)으로 해석하고, 이 도구는 브라우저의 로컬 시간대로 다음 실행 시각을 계산해 보여 줍니다. 클라우드 서버는 기본이 UTC인 경우가 많아서, 한국에서 「0 9 * * *」로 아침 9시를 의도했는데 실제로는 한국 시각 18시에 도는 일이 생깁니다.

    GitHub Actions의 schedule 이벤트도 기본은 UTC입니다. 한국 시각 오전 9시에 돌리려면 0 0 * * *을 써야 합니다(UTC+9). 최근 문서에는 IANA 시간대 문자열을 적는 timezone 키가 추가되어 있지만, 이전에 작성된 워크플로는 대부분 UTC 기준이므로 읽을 때 주의해야 합니다. GitHub 문서는 또 가장 짧은 간격이 5분이라는 점, 매시 정각처럼 부하가 몰리는 시각에는 실행이 늦어지거나 대기열에서 빠질 수 있다는 점, 공개 저장소는 60일 동안 활동이 없으면 예약 실행이 자동으로 꺼진다는 점을 밝히고 있습니다. 정각 부하를 피하려면 7 * * * *처럼 분을 어긋나게 두는 편이 낫습니다.

    서머타임이 있는 지역의 함정

    한국은 서머타임이 없지만 미국·유럽 서버라면 1년에 두 번 문제가 됩니다. 봄에 시계가 2시에서 3시로 건너뛰는 날에는 2시 30분이 존재하지 않고, 가을에 1시대가 두 번 반복되는 날에는 같은 시각이 두 번 옵니다. 구현마다 처리가 달라서, 건너뛴 시각의 작업을 직후에 한 번 실행하는 cron도 있고 그냥 건너뛰는 스케줄러도 있습니다. GitHub Actions는 timezone을 지정한 경우 건너뛴 시각의 작업을 다음 유효 시각(예: 2:30 → 3:00)으로 넘긴다고 적고 있습니다.

    가장 확실한 대처는 새벽 1~3시를 피해 예약하거나, 서버를 UTC로 두고 UTC 기준으로 표현식을 쓰는 것입니다. 이 도구의 다음 실행 목록은 브라우저 로컬 시간 기준이라, 서머타임이 있는 지역에서 전환일을 넘겨 보면 그 차이가 그대로 드러납니다.

    5필드와 6·7필드: Quartz·Spring 표현식

    Unix cron은 분부터 시작하는 5필드입니다. Quartz(그리고 이를 따른 Spring @Scheduled)는 맨 앞에 초가 붙은 6필드이고 끝에 연도를 선택으로 붙일 수 있어 최대 7필드입니다. 그래서 Quartz의 「0 0 9 * * ?」는 Unix의 「0 9 * * *」와 같은 뜻입니다.

    차이는 필드 수만이 아닙니다. Quartz는 일과 요일 중 하나에 반드시 ?를 넣어야 하고(둘 다 값을 주는 것은 지원하지 않음), 요일 숫자가 1=일요일~7=토요일입니다. Unix cron은 0=일요일이고 7도 일요일로 받습니다. 이 도구는 5필드만 해석하지만, 6·7필드를 넣으면 Quartz·Spring 형식이라고 알려 주고 의미가 그대로 옮겨지는 경우 5필드로 바꾸는 버튼을 보여 줍니다. 초가 0이 아니거나 L·W·# 같은 Quartz 전용 문법, 특정 연도가 있으면 5필드로 표현할 수 없어 바꾸지 않습니다. 6필드에 숫자 요일이 있으면 Quartz(1=일요일)인지 Spring(0=일요일, Unix와 같음)인지 알 수 없어 역시 바꾸지 않으니, MON-FRI처럼 이름으로 쓰거나 직접 초 필드를 지우고 ?를 *로 바꾸세요. Quartz라면 요일 숫자를 하나씩 빼야 합니다.

    빌더 모드로 만들 때

    빌더는 「매 N분」「매일」「매주」「매월」「매년」 같은 빈도를 고르면 해당 필드만 채우고 나머지는 *로 둡니다. 간격은 */N으로 쓰이는데, */N은 0부터 N씩 건너뛰는 것이지 「시작한 시점부터 N분마다」가 아닙니다. 그래서 */7은 매시 0, 7, …, 56분에 돌고 다음 시의 0분과는 4분 간격이 됩니다. 60을 나누어떨어지게 하는 값(5, 10, 15, 20, 30)을 쓰는 편이 예측하기 쉽습니다.

    기존 crontab 줄을 표현식 칸에 붙여 넣으면 빌더 상태로 거꾸로 풀어 주므로, 남이 쓴 줄을 고칠 때도 쓸 수 있습니다. 빌더 모드에서도 요일과 일을 함께 고르면 위의 OR 규칙이 그대로 적용됩니다.

    예시

    일·요일 OR 규칙

    입력
    0 9 1 * 1 (기준: 2026-09-22 화요일)
    결과
    9/28(월) 09:00, 10/1(목) 09:00, 10/5(월) 09:00, 10/12(월) 09:00, 10/19(월) 09:00

    10월 1일은 목요일인데도 실행됩니다. 1일이거나 월요일이면 도는 OR 규칙 때문입니다.

    GitHub Actions에서 한국 시각 오전 9시

    입력
    cron: '0 0 * * 1-5' (시간대 지정 없음)
    결과
    UTC 월~금 00:00 = 한국 시각 월~금 09:00

    UTC 기준으로 적어야 합니다. 0 9 * * 1-5로 쓰면 한국 시각 18시에 돕니다. 부하 때문에 몇 분 늦게 시작될 수 있습니다.

    영원히 오지 않는 날짜

    입력
    0 0 30 2 *
    결과
    다음 실행 없음

    2월 30일은 없습니다. 도구는 최대 4년치를 분 단위로 찾아보고 결과가 없으면 빈 목록을 보여 줍니다. 31일을 지정하면 30일까지인 달에는 건너뜁니다.

    Quartz 표현식 옮기기

    입력
    Quartz: 0 30 8 ? * MON-FRI
    결과
    Unix: 30 8 * * 1-5

    맨 앞 초(0)를 지우고 ?를 *로 바꿉니다. 이름(MON-FRI)은 두 형식 모두 같지만 숫자로 적힌 요일은 Quartz가 1=일요일이라 1씩 빼야 합니다.

    사용 방법

    1. 파서 탭에 cron 표현식을 붙여 넣거나 @daily 같은 매크로를 입력합니다.
    2. 문장 설명과 다음 실행 시각(브라우저 로컬 시간)을 확인합니다.
    3. 새로 만들 때는 빌더 탭에서 빈도와 시각을 고르고 생성된 줄을 복사합니다.

    자주 묻는 질문

    0 9 1 * 1이 매주 월요일에도 도는 이유는?

    일과 요일을 둘 다 지정하면 POSIX 규격상 둘 중 하나만 맞아도 실행되는 OR 조건이기 때문입니다. 교집합이 필요하면 한쪽을 *로 두고 스크립트에서 나머지 조건을 검사하세요.

    GitHub Actions 예약 작업이 9시간 늦게 돌아요.

    schedule의 cron은 기본적으로 UTC입니다. 한국 시각에서 9시간을 뺀 값으로 쓰거나, 지원되는 경우 timezone: "Asia/Seoul"을 함께 적으세요.

    초 단위로 실행할 수 있나요?

    표준 cron의 최소 단위는 1분입니다. 초 필드는 Quartz·Spring 같은 6필드 형식에만 있고, 이 도구는 5필드만 해석합니다(초가 0인 6·7필드는 5필드로 바꿔 줍니다).

    요일에 7을 써도 되나요?

    Unix cron에서 7은 0과 같은 일요일로 받아들여지며 이 도구도 그렇게 처리합니다. 다만 POSIX 규격의 범위는 0~6이므로 호환성을 생각하면 0을 쓰는 편이 안전합니다.

    */7 */5 같은 간격이 불규칙하게 나와요.

    */N은 필드의 시작값(분이면 0)부터 N씩 건너뛴 값의 목록입니다. 시 경계에서 간격이 끊기므로 60의 약수가 아니면 마지막 간격이 짧아집니다.

    출처

    기준일:

    개인정보와 저장 방식