Cron 표현식 설명: 완전한 구문 가이드
· 12분 읽기
📑 목차
Cron은 Unix 계열 운영 체제의 시간 기반 작업 스케줄러입니다. 자정에 스크립트를 실행하거나, 매주 일요일마다 데이터베이스를 백업하거나, 매시간 임시 파일을 정리하거나, 매월 1일에 보고서를 전송해야 한다면 cron이 필요한 도구입니다. 하지만 0 */6 * * 1-5와 같은 암호 같은 문자열로 된 표현식 구문은 처음에는 어렵게 느껴질 수 있습니다.
이 가이드는 cron 표현식을 완전히 이해하기 쉽게 설명합니다. 모든 필드, 모든 특수 문자를 배우고, 수십 가지 실제 패턴을 보며, 숙련된 개발자들도 실수하는 시간대 함정을 이해하게 될 것입니다. 백업 스케줄링, 유지보수 스크립트 실행, 보고서 자동화 등 무엇을 하든 cron 구문을 마스터하는 것은 모든 개발자와 시스템 관리자에게 필수적입니다.
Cron 표현식의 구조
표준 cron 표현식은 공백으로 구분된 다섯 개의 필드로 구성됩니다. 각 필드는 시간 단위를 나타내며, 함께 작업이 실행되어야 하는 정확한 시간을 정의합니다.
┌───────────── 분 (0-59)
│ ┌─────────── 시 (0-23)
│ │ ┌───────── 일 (1-31)
│ │ │ ┌─────── 월 (1-12)
│ │ │ │ ┌───── 요일 (0-6, 일요일=0)
│ │ │ │ │
* * * * * 실행할 명령
각 필드는 숫자, 범위, 목록, 단계 값 또는 와일드카드를 포함할 수 있습니다. cron의 장점은 이러한 간단한 구성 요소들이 결합되어 매우 유연한 스케줄링 패턴을 만들 수 있다는 것입니다.
일부 cron 구현은 초를 위한 여섯 번째 필드와 연도를 위한 일곱 번째 필드를 지원하지만, 표준 다섯 필드 형식은 보편적으로 지원되며 Linux, macOS, BSD 변형을 포함한 대부분의 Unix 계열 시스템에서 접하게 될 형식입니다.
다섯 가지 필드 상세 설명
올바른 cron 표현식을 작성하려면 각 필드의 범위와 동작을 이해하는 것이 중요합니다. 각각을 체계적으로 살펴보겠습니다.
| 필드 | 범위 | 특수 문자 | 예시 |
|---|---|---|---|
| 분 | 0-59 | * , - / | */15 (15분마다) |
| 시 | 0-23 | * , - / | 9-17 (오전 9시~오후 5시) |
| 일 | 1-31 | * , - / L W | 1,15 (1일과 15일) |
| 월 | 1-12 또는 JAN-DEC | * , - / | 1-6 (1월~6월) |
| 요일 | 0-6 또는 SUN-SAT | * , - / L # | 1-5 (월요일~금요일) |
분 필드 (0-59)
분 필드는 작업이 실행될 시간의 분을 제어합니다. 0 값은 정각을 의미하고, 30은 30분을 의미하며, 59는 시간의 마지막 분입니다.
일반적인 패턴으로는 5분마다를 의미하는 */5, 시간당 두 번을 의미하는 0,30, 또는 매시간 15분을 의미하는 15가 있습니다.
시 필드 (0-23)
시간은 24시간 형식을 사용하며 0은 자정, 12는 정오, 23은 오후 11시입니다. 이것은 12시간 AM/PM 표기법에 익숙한 개발자들에게 가장 흔한 혼란의 원인 중 하나입니다.
업무 시간은 일반적으로 9-17(오전 9시~오후 5시)로 표현되며, 야간 유지보수는 0-6(자정~오전 6시)을 사용할 수 있습니다.
일 필드 (1-31)
이 필드는 실행할 월의 날짜를 지정합니다. 유효한 값은 1부터 31까지이지만, 모든 월이 31일을 가지는 것은 아닙니다. Cron은 이를 우아하게 처리합니다 — 2월에 31일을 지정하면 해당 월에는 작업이 실행되지 않습니다.
특수 문자 L은 "월의 마지막 날"을 의미하며 월의 길이와 윤년을 자동으로 조정합니다.
월 필드 (1-12)
월은 숫자로 지정할 수 있으며(1은 1월, 12는 12월) 세 글자 약어(JAN, FEB, MAR 등)를 사용할 수도 있습니다. 약어는 대부분의 구현에서 대소문자를 구분하지 않습니다.
분기별 일정은 종종 1,4,7,10(1월, 4월, 7월, 10월) 또는 회계 분기 말을 위한 3,6,9,12와 같은 패턴을 사용합니다.
요일 필드 (0-6)
요일은 0(일요일)부터 6(토요일)까지입니다. 일부 시스템은 편의를 위해 7도 일요일로 허용합니다. 세 글자 약어(SUN, MON, TUE 등)도 지원됩니다.
가장 일반적인 패턴은 평일(월요일~금요일)을 위한 1-5이며, 0,6 또는 6,0은 주말을 나타냅니다.
전문가 팁: 일과 요일이 모두 지정되면(와일드카드가 아닌 경우), 작업은 둘 중 하나의 조건이 충족될 때 실행됩니다(OR 논리), 둘 다가 아닙니다. 이것은 많은 개발자들을 놀라게 합니다. 예를 들어, 0 0 13 * 5는 매월 13일 그리고 매주 금요일에 실행되며, 13일의 금요일에만 실행되는 것이 아닙니다.
특수 문자 설명
특수 문자는 cron 표현식에 강력함과 유연성을 부여합니다. 각 문자는 스케줄링 패턴을 정의하는 데 특정한 목적을 가지고 있습니다.
별표 (*) - 와일드카드
별표는 해당 필드의 "모든 가능한 값"을 의미합니다. 가장 일반적으로 사용되는 특수 문자이며 거의 모든 cron 표현식에 나타납니다.
* * * * *— 매일 매분 실행0 * * * *— 매시간 정각에 실행0 0 * * *— 매일 자정에 실행
쉼표 (,) - 목록 구분자
쉼표를 사용하면 여러 개별 값을 지정할 수 있습니다. 특정하고 연속되지 않은 시간이 필요할 때 완벽합니다.
0 9,12,15,18 * * *— 오전 9시, 정오, 오후 3시, 오후 6시에 실행0 0 1,15 * *— 매월 1일과 15일 자정에 실행0 0 * * 1,3,5— 월요일, 수요일, 금요일 자정에 실행
하이픈 (-) - 범위 연산자
하이픈은 포괄적 범위를 정의하여 연속된 기간을 쉽게 지정할 수 있게 합니다.
0 9-17 * * *— 오전 9시부터 오후 5시까지 매시간 실행0 0 * * 1-5— 월요일부터 금요일까지 자정에 실행0 0 1-7 1 *— 1월 첫째 주 동안 매일 실행
슬래시 (/) - 단계 값
슬래시는 단계 간격을 지정하여 범위 내에서 정기적인 간격으로 작업을 실행할 수 있게 합니다. 구문은 시작/단계 또는 전체 범위에 대해 */단계입니다.
*/15 * * * *— 15분마다 (0, 15, 30, 45)0 */2 * * *— 2시간마다 (0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22)0 0 */3 * *— 3일마다 (1일, 4일, 7일, 10일 등)0 9-17/2 * * *— 오전 9시부터 오후 5시 사이 2시간마다 (9, 11, 13, 15, 17)
빠른 팁: */15는 "지금부터 15분마다"를 의미하지 않습니다 — 매시간 0, 15, 30, 45분을 의미합니다. 10:07에 cron 작업을 추가하면 */15 패턴은 10:22가 아닌 10:15에 처음 실행됩니다.
L - 마지막 날
L 문자는 "마지막"을 의미하며 일과 요일 필드에서 사용됩니다. 다양한 월 길이를 고려해야 하는 월말 처리에 특히 유용합니다.
0 0 L * *— 매월 마지막 날 자정에 실행0 0 * * L— 주의 마지막 날(토요일) 자정에 실행0 0 * * 5L— 매월 마지막 금요일에 실행
W - 가장 가까운 평일
W 문자는 주어진 날짜에 가장 가까운 평일을 찾습니다. 지정된 날이 주말에 해당하면 작업은 가장 가까운 평일에 실행됩니다.
0 0 15W * *— 15일에 가장 가까운 평일에 실행0 0 1W * *— 월의 첫 번째 평일에 실행0 0 LW * *— 월의 마지막 평일에 실행
해시 (#) - N번째 요일
해시 문자는 월 내에서 요일의 N번째 발생을 지정합니다. 구문은 요일#발생입니다.
0 0 * * 1#1— 매월 첫 번째 월요일0 0 * * 5#2— 매월 두 번째 금요일0 0 * * 3#4— 매월 네 번째 수요일
L, W, #는 모든 cron 구현에서 지원되지 않습니다. Vixie cron과 대부분의 클라우드 기반 스케줄러와 같은 최신 버전에서는 사용할 수 있지만 오래된 Unix 시스템에서는 작동하지 않을 수 있습니다.
일반적인 Cron 패턴
정기적으로 사용하게 될 실제 스케줄링 패턴을 살펴보겠습니다. 이 예제들은 가장 일반적인 자동화 시나리오를 다룹니다.
매분, 매시간, 매일
* * * * *— 매분 (부하 문제를 일으킬 수 있으므로 신중하게 사용)0 * * * *— 매시간 0분에0 0 * * *— 매일 자정에0 12 * * *— 매일 정오에
하루에 여러 번
0 0,12 * * *— 하루에 두 번 자정과 정오에0 */6 * * *— 6시간마다 (0:00, 6:00, 12:00, 18:00)0 8,12,16,20 * * *— 특정 시간에 하루에 네 번*/30 * * * *— 30분마다
주간 일정
0 0 * * 0— 매주 일요일 자정에0 0 * * 1-5— 평일 자정에0 9 * * 1— 매주 월요일 오전 9시에0 0 * * 6,0— 주말 자정에
월간 일정
0 0 1 * *— 매월 1일 자정에0 0 L * *— 매월 마지막 날 자정에0 0 1,15 * *— 매월 1일과 15일에0 0 1 */3 *— 분기의 첫날 (1월, 4월, 7월, 10월)
업무 시간 및 유지보수 시간
0 9-17 * * 1-5— 업무 시간 동안 매시간 (오전 9시~오후 5시, 월~금)*/15 9-17 * * 1-5— 업무 시간 동안 15분마다0 2 * * *— 매일 오전 2시 (일반적인 유지보수 시간)0 3 * * 0— 매주 일요일 오전 3시 (주간 유지보수)
| 사용 사례 | Cron 표현식 | 설명 |
|---|---|---|
| 데이터베이스 백업 | 0 2 * * * |
매일 오전 2시 |
| 로그 순환 | 0 0 * * 0 |
매주 일요일 자정 |
| 캐시 정리 |