크론(cron) 표현식 읽고 쓰는 법: 다섯 칸의 의미와 자주 쓰는 예시
매일 새벽 2시 백업, 평일 오전 9시 보고서 발송, 10분마다 상태 확인. 서버에서 반복 작업을 예약할 때 쓰는 크론 표현식을 처음부터 정리합니다.
다섯 칸의 의미
표준 유닉스 크론 표현식은 공백으로 구분된 다섯 개의 필드로 이루어집니다. 왼쪽부터 분(0–59), 시(0–23), 일(1–31), 월(1–12), 요일(0–7, 0과 7은 일요일)입니다. 각 필드의 조건이 모두 맞는 순간마다 작업이 실행됩니다.
예를 들어 0 2 * * *는 '0분, 2시, 매일, 매월, 모든 요일', 즉 매일 새벽 2시 정각을 뜻합니다. 별표(*)는 '모든 값'을 의미합니다.
┌───── 분 (0-59)
│ ┌─── 시 (0-23)
│ │ ┌─ 일 (1-31)
│ │ │ ┌ 월 (1-12)
│ │ │ │ ┌ 요일 (0-7, 일=0 또는 7)
│ │ │ │ │
0 2 * * *
특수 기호 네 가지
이 네 가지만 조합해도 대부분의 일정을 표현할 수 있습니다. 일부 시스템은 MON, JAN 같은 영문 약어도 허용합니다.
- * (모든 값): 시 필드의 *는 매시간을 뜻합니다.
- , (목록): 1,15는 1일과 15일을 뜻합니다.
- - (범위): 1-5는 요일 필드에서 월요일부터 금요일입니다.
- / (간격): */10은 분 필드에서 0, 10, 20, ... 즉 10분마다입니다. 5-59/15처럼 시작값을 지정할 수도 있습니다.
자주 쓰는 예시
새로운 표현식을 만들었다면 다음 실행 시각 몇 개를 직접 계산해 보며 의도와 맞는지 확인하는 것이 좋습니다. 특히 */ 간격은 '시작 시점부터'가 아니라 '0부터' 세는 점을 기억하세요. 분 필드의 */45는 45분마다가 아니라 매시 0분과 45분에 실행됩니다.
*/5 * * * * 5분마다
0 * * * * 매시 정각
30 9 * * 1-5 평일 오전 9시 30분
0 0 1 * * 매월 1일 자정
0 18 * * 5 매주 금요일 오후 6시
0 3 * * 0 매주 일요일 새벽 3시
0 9,18 * * * 매일 오전 9시와 오후 6시
0 0 1 1 * 매년 1월 1일 자정
헷갈리기 쉬운 함정
가장 유명한 함정은 일 필드와 요일 필드를 함께 지정할 때입니다. 0 0 13 * 5를 '13일의 금요일'로 생각하기 쉽지만, 표준 크론에서는 두 필드가 모두 *가 아니면 '또는(OR)' 조건으로 동작합니다. 즉 매월 13일, 그리고 매주 금요일마다 실행됩니다.
두 번째는 '매월 마지막 날'입니다. 표준 다섯 필드 크론에는 마지막 날을 뜻하는 기호가 없습니다. 28~31일에 실행한 뒤 스크립트 안에서 '내일이 1일인지' 확인하는 방식이 흔히 쓰입니다. 쿼츠(Quartz) 같은 일부 스케줄러는 L 기호를 지원하지만, 이 경우 초 필드가 앞에 붙은 6~7칸 형식이라 표준 크론과 호환되지 않습니다.
크론은 어느 시간대로 동작할까
크론은 기본적으로 서버의 시스템 시간대를 따릅니다. 클라우드 서버는 대부분 UTC로 설정되어 있어서, 한국 시간 오전 9시에 보내려던 보고서가 오후 6시에 나가는 일이 흔합니다. 한국 시간 오전 9시는 UTC 0시이므로 UTC 서버라면 0 0 * * *로 적어야 합니다.
깃허브 액션, 쿠버네티스 크론잡 같은 서비스도 기본은 UTC입니다. 일정이 서머타임을 쓰는 지역 기준이라면 일 년에 두 번 실행 시각이 한 시간씩 어긋날 수 있다는 점도 고려해야 합니다.
운영할 때의 팁
AIBIZAP 크론 생성기에서 '매일', '매주' 같은 일정을 고르면 표현식이 자동으로 만들어지므로, 문법을 외우지 않아도 정확한 일정을 설정할 수 있습니다.
- 모든 서버가 정각에 동시에 무거운 작업을 시작하지 않도록, 0분 대신 7분, 23분처럼 분을 흩어 둡니다.
- 작업이 다음 실행 전까지 끝나지 않을 수 있다면 중복 실행 방지 잠금을 걸어 둡니다.
- 크론은 환경 변수와 PATH가 대화형 셸과 다르므로 스크립트에서 절대 경로를 사용합니다.
- 실행 결과를 로그 파일로 남겨, 조용히 실패하는 작업이 없도록 합니다.