Cron 표현식 완전 정복: 무엇이든 스케줄링하기
매일 밤 새벽 3시에 데이터베이스 백업을 실행해야 합니다. 또는 매주 월요일 아침에 보고서를 보내야 합니다. 또는 15분마다 캐시를 비워야 합니다. Linux와 Unix 서버에서 이를 위한 도구는 cron이며, cron에게 언제 실행할지 알려주는 방법이 cron 표현식입니다.
Cron 표현식은 처음 보면 어렵게 느껴집니다. 0 3 * * * 또는 */15 9-17 * * 1-5 같은 것은 패턴을 모르면 암호처럼 보일 수 있습니다. 하지만 다섯 개의 필드만 이해하면 구문은 놀라울 정도로 간단합니다.
다섯 개의 필드
모든 표준 cron 표현식은 정확히 다섯 개의 필드를 가지며 공백으로 구분됩니다. 각 필드는 시간 단위를 나타냅니다:
┌───────────── 분 (0-59)
│ ┌───────────── 시 (0-23)
│ │ ┌───────────── 일 (1-31)
│ │ │ ┌───────────── 월 (1-12)
│ │ │ │ ┌───────────── 요일 (0-7, 0과 7은 일요일)
│ │ │ │ │
* * * * *
그게 전부입니다. 다섯 개의 필드, 왼쪽에서 오른쪽으로: 분, 시, 일, 월, 요일.
알고 계셨나요? "cron"이라는 이름은 시간을 뜻하는 그리스어 "chronos"에서 유래했습니다. cron 데몬(백그라운드 프로세스)은 1975년부터 Unix 계열 운영체제의 핵심 요소였습니다.
특수 문자
별표 (*) — 모든 값
별표는 해당 필드의 "모든 가능한 값"을 의미합니다.
* * * * * = 매일 매시간 매분.
쉼표 (,) — 여러 값
쉼표는 개별 값을 구분합니다.
0 9,12,18 * * * = 9시, 12시, 18시의 0분에 (오전 9시, 오후 12시, 오후 6시).
대시 (-) — 값 범위
대시는 범위를 정의합니다.
0 9-17 * * * = 9시부터 17시까지 매시간 0분에 (오전 9시부터 오후 5시까지, 매시간).
슬래시 (/) — 간격 값
슬래시는 간격을 정의합니다.
*/15 * * * * = 15분마다 (매시 0분, 15분, 30분, 45분).
0 */2 * * * = 2시간마다 0분에 (자정, 오전 2시, 오전 4시, ...).
Cron 표현식 읽기: 연습
일반적인 예제를 살펴봅시다. 각각에 대해 다섯 개의 필드를 왼쪽에서 오른쪽으로 읽으세요.
0 3 * * * — 매일 오전 3:00
| 필드 | 값 | 의미 |
|---|---|---|
| 분 | 0 | 0분에 |
| 시 | 3 | 3시에 (오전 3시) |
| 일 | * | 매일 |
| 월 | * | 매월 |
| 요일 | * | 모든 요일 |
해석: "매일 오전 3시에." 야간 백업의 전형적인 선택입니다.
*/15 * * * * — 15분마다
| 필드 | 값 | 의미 |
|---|---|---|
| 분 | */15 | 15분마다 |
| 시 | * | 매시간 |
| 일 | * | 매일 |
| 월 | * | 매월 |
| 요일 | * | 매일 |
해석: "24시간 내내 15분마다." 상태 확인과 캐시 갱신에 흔히 사용됩니다.
0 9 * * 1-5 — 평일 오전 9:00
| 필드 | 값 | 의미 |
|---|---|---|
| 분 | 0 | 0분에 |
| 시 | 9 | 9시에 |
| 일 | * | 매일 |
| 월 | * | 매월 |
| 요일 | 1-5 | 월요일부터 금요일 |
해석: "월요일부터 금요일까지 오전 9시에." 일일 업무 보고서에 적합합니다.
0 0 1 * * — 매월 1일
| 필드 | 값 | 의미 |
|---|---|---|
| 분 | 0 | 0분에 |
| 시 | 0 | 0시에 (자정) |
| 일 | 1 | 1일에 |
| 월 | * | 매월 |
| 요일 | * | 모든 요일 |
해석: "매월 1일 자정에." 월간 보고서, 결제, 정리에 사용됩니다.
30 8 * * 1 — 매주 월요일 오전 8:30
| 필드 | 값 | 의미 |
|---|---|---|
| 분 | 30 | 30분에 |
| 시 | 8 | 8시에 |
| 일 | * | 매일 |
| 월 | * | 매월 |
| 요일 | 1 | 월요일 |
해석: "매주 월요일 오전 8:30에." 주간 팀 알림에 적합합니다.
직접 Cron 표현식 작성하기
체계적인 접근법입니다:
- 언제인지 시작하세요. "매일 오전 3시" 또는 "업무 시간 동안 5분마다."
- 왼쪽에서 오른쪽으로 필드를 채우세요. 분부터 시작하고, 시, 일, 월, 요일 순서로.
- "모든"에는
*을 사용하세요. 특정 필드에 조건이 없으면*을 사용하세요. - 배포 전에 테스트하세요. 항상 표현식이 원하는 스케줄을 생성하는지 확인하세요.
자주 쓰는 패턴 빠른 참조
| 스케줄 | 표현식 |
|---|---|
| 매분 | * * * * * |
| 5분마다 | */5 * * * * |
| 매시간 | 0 * * * * |
| 매일 자정 | 0 0 * * * |
| 매일 오전 3:00 | 0 3 * * * |
| 매주 월요일 오전 9:00 | 0 9 * * 1 |
| 평일 오전 8:30 | 30 8 * * 1-5 |
| 매월 1일 | 0 0 1 * * |
| 업무 시간 15분마다 | */15 9-17 * * 1-5 |
| 하루 두 번 (오전 9시, 오후 6시) | 0 9,18 * * * |
| 매주 일요일 오전 2:00 | 0 2 * * 0 |
흔한 실수
시간이 0-23임을 잊는 것
13시는 오후 1시이지 1시가 아닙니다. 흔한 오류는 0 1 * * *을 오후 1시에 실행된다고 생각하고 작성하는 것인데, 실제로는 오전 1시에 실행됩니다.
요일 혼동
일요일은 0 또는 7이 될 수 있습니다(둘 다 유효). 월요일은 1, 토요일은 6입니다. 일부 사람들은 월요일이 0이라고 예상합니다.
일(day of month)과 요일(day of week) 상호 작용
일과 요일을 모두 지정하면(둘 다 *이 아닌 경우), 대부분의 cron 구현은 둘 중 하나라도 조건이 충족되면 작업을 실행합니다. 둘 다 충족될 때가 아닙니다. 이는 많은 사람들을 당혹스럽게 합니다.
주의 표현식 0 9 15 * 1은 "15일에, 월요일인 경우에만 오전 9시"를 의미하지 않습니다. "매월 15일 오전 9시 그리고 매주 월요일 오전 9시"를 의미합니다. 이것은 예상치 못한 동작의 흔한 원인입니다.
시간대 인식
Cron은 서버의 로컬 시간대에서 실행됩니다. 서버가 UTC에 있고 여러분이 뉴욕(UTC-5)에 있다면, 0 9 * * * cron 작업은 여러분 시간으로 오전 4시에 실행됩니다. 항상 서버의 시간대를 확인하세요.
팁 배포 전에 cron 표현식을 테스트하고 시각화하세요: Cron 표현식 읽기 및 테스트 방법. 다음 실행 시간을 확인하고 스케줄이 의도한 것과 일치하는지 확인하세요.
Cron 표현식을 만들고 테스트하세요:
무료이며 즉시 사용 가능하고 가입이 필요 없습니다.