Cron이란? — 리눅스 세계의 알람 시계
개발자라면 한 번쯤 "매일 새벽 3시에 DB 백업", "매주 월요일 오전 9시에 리포트 메일 발송", "5분마다 상태 체크" 같은 작업을 자동화해야 하는 상황을 만났을 겁니다. 이런 시간 기반 작업 스케줄링의 표준 방법이 바로 Cron입니다.
Cron은 1970년대 유닉스 운영체제에서 처음 등장한 작업 스케줄러입니다. 반세기가 지난 지금도 리눅스 서버, AWS Lambda, GitHub Actions, Kubernetes CronJob, Google Cloud Scheduler 등 현대 인프라 전반에서 핵심 스케줄링 표준으로 사용됩니다. 그만큼 익혀두면 두고두고 활용할 수 있는 기술입니다.
Cron의 핵심은 Cron 표현식(Cron Expression)입니다. 언뜻 보면 암호 같은 문자열이지만, 규칙을 알면 누구나 쉽게 읽고 쓸 수 있습니다. HMApps의 Cron 생성기를 활용하면 문법 걱정 없이 시각적으로 스케줄을 설정하고, 다음 실행 시간까지 미리 확인할 수 있습니다.
Cron 표현식 문법 완전 해부
표준 Cron 표현식은 5개 필드로 구성됩니다. 각 필드는 공백으로 구분됩니다.
┌─────── 분 (0–59)
│ ┌───── 시 (0–23)
│ │ ┌─── 일 (1–31)
│ │ │ ┌─ 월 (1–12)
│ │ │ │ ┌ 요일 (0–7, 0과 7 모두 일요일)
│ │ │ │ │
* * * * *AWS, Quartz, Spring 등 일부 플랫폼은 초(seconds) 또는 연도(year) 필드가 추가된 6~7개 필드 형식을 사용하기도 합니다. HMApps Cron 생성기는 두 형식 모두 지원합니다.
특수 문자 의미
| 문자 | 의미 | 예시 |
|---|---|---|
* | 모든 값 (와일드카드) | * * * * * → 매 1분마다 |
, | 여러 값 나열 | 1,15,30 → 1분, 15분, 30분에 |
- | 범위 | 9-17 → 9시부터 17시까지 |
/ | 간격(step) | */5 → 5 간격마다 |
L | 마지막(Last) | L (일 필드) → 월의 마지막 날 |
W | 가장 가까운 평일(Weekday) | 15W → 15일에 가장 가까운 평일 |
# | N번째 요일 | 2#1 → 월의 첫 번째 화요일 |
? | 값 없음 (일/요일 충돌 방지) | 일 또는 요일 중 하나에만 지정할 때 |
자주 쓰는 Cron 표현식 패턴 30선
실무에서 가장 많이 사용하는 패턴을 카테고리별로 정리했습니다.
기본 패턴
* * * * *— 매 1분마다 실행*/5 * * * *— 5분마다 실행*/10 * * * *— 10분마다 실행*/30 * * * *— 30분마다 실행0 * * * *— 매 시 정각 실행0 */2 * * *— 2시간마다 (짝수 시 정각) 실행
매일 특정 시간
0 0 * * *— 매일 자정 (00:00)0 3 * * *— 매일 새벽 3시 (DB 백업에 자주 사용)0 9 * * *— 매일 오전 9시30 18 * * *— 매일 오후 6시 30분0 8,12,18 * * *— 매일 8시, 12시, 18시
주간 패턴
0 9 * * 1— 매주 월요일 오전 9시0 9 * * 1-5— 평일(월~금) 오전 9시0 10 * * 6,0— 주말(토, 일) 오전 10시0 18 * * 5— 매주 금요일 오후 6시 (주간 리포트)0 0 * * 0— 매주 일요일 자정 (주간 정산)
월간 패턴
0 0 1 * *— 매월 1일 자정 (월간 정산)0 9 1,15 * *— 매월 1일과 15일 오전 9시0 0 L * *— 매월 마지막 날 자정0 0 1 1,4,7,10 *— 분기 첫날 자정 (1월, 4월, 7월, 10월)
연간 패턴
0 0 1 1 *— 매년 1월 1일 자정 (신년 초기화)0 9 25 12 *— 매년 12월 25일 오전 9시
플랫폼별 Cron 표현식 차이점
Cron 표현식은 플랫폼마다 미묘한 차이가 있습니다. 이를 무시하면 예상과 다른 시간에 작업이 실행되는 문제가 생깁니다.
표준 Unix Cron (5 필드)
# 매일 오전 9시
0 9 * * *AWS CloudWatch Events / EventBridge (6 필드, cron())
# 매일 오전 9시 UTC
cron(0 9 * * ? *)AWS는 ? 문자를 반드시 사용해야 하며, 일(day-of-month)과 요일(day-of-week) 중 하나에만 값을 지정할 수 있습니다. 또한 AWS Cron은 항상 UTC 기준이므로, 한국 시간(KST = UTC+9)으로 오전 9시를 실행하려면 0 0 * * ? * (UTC 자정)으로 설정해야 합니다.
Spring / Quartz Scheduler (6–7 필드)
# 매일 오전 9시 (초 분 시 일 월 요일 [연도])
0 0 9 * * ?Quartz는 맨 앞에 초(seconds) 필드가 추가됩니다. 순서가 초 분 시 일 월 요일 임에 주의하세요.
GitHub Actions
# .github/workflows/cron-job.yml
on:
schedule:
- cron: '0 0 * * *' # 매일 UTC 자정GitHub Actions도 표준 5필드 형식을 사용하지만, 마찬가지로 UTC 기준입니다. 또한 무료 계획에서는 일정이 몇 분 지연될 수 있습니다.
Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 3 * * *" # 매일 새벽 3시
jobTemplate:
...Cron 표현식 작성 시 흔한 실수와 해결법
실수 1: 타임존 혼동
가장 흔하고 치명적인 실수입니다. AWS, GitHub Actions 등은 기본적으로 UTC를 사용합니다. 한국(KST)은 UTC+9이므로, "한국 시간 오전 9시 = UTC 자정(00:00)"임을 항상 기억하세요.
# 한국 시간 기준 오전 9시를 AWS에서 설정할 때
cron(0 0 * * ? *) # UTC 00:00 = KST 09:00
# 실수: 이렇게 하면 KST 오후 6시에 실행됨
cron(0 9 * * ? *) # UTC 09:00 = KST 18:00실수 2: 일(day-of-month)과 요일(day-of-week) 동시 지정
표준 Cron에서 일(day)과 요일을 둘 다 지정하면 OR 조건으로 동작합니다. 예를 들어 0 9 1 * 1은 "매월 1일 오전 9시 또는 매주 월요일 오전 9시"를 의미합니다. 의도한 동작인지 꼭 확인하세요.
실수 3: 0과 7 모두 일요일
요일 필드에서 0과 7은 모두 일요일을 가리킵니다. 1-7로 지정하면 월요일~일요일이 되지만, 0-6으로 지정해도 일~토가 됩니다. 플랫폼에 따라 다를 수 있으니 테스트를 권장합니다.
실수 4: "매 X분마다"와 "특정 분"의 혼동
# 잘못된 이해: 매 2분마다
0,2 * * * * # 실제: 0분, 2분에 실행 (즉, 1시간에 2번)
# 올바른 표현: 매 2분마다
*/2 * * * * # 0분, 2분, 4분, 6분... 실행실수 5: 2월 29일, 31일 등 존재하지 않는 날짜
0 0 29-31 * * 같은 표현을 쓰면 2월에는 29~31일이 없어서 실행이 건너뛰어집니다. 월말 작업은 L 문자 또는 별도 로직 처리를 권장합니다.
실전 활용 사례: 분야별 Cron 스케줄링 예시
웹 서비스 / 백엔드
- DB 백업:
0 3 * * *— 새벽 3시, 트래픽 최저 시간대 - 세션 만료 정리:
0 */6 * * *— 6시간마다 - 캐시 갱신:
*/30 * * * *— 30분마다 - 사용자 활동 통계 집계:
5 0 * * *— 매일 자정 5분 (전날 데이터) - 만료 쿠폰/토큰 삭제:
0 2 * * *— 매일 새벽 2시
데이터 파이프라인 / ETL
- 일간 데이터 수집:
0 1 * * *— 전날 데이터 수집 (새벽 1시) - 주간 리포트 생성:
0 6 * * 1— 월요일 오전 6시 (업무 시작 전) - 월간 정산:
0 0 1 * *— 매월 1일 자정 - 실시간 환율/주가 수집:
*/5 9-16 * * 1-5— 평일 9~16시 5분마다
DevOps / CI·CD
- 야간 빌드 테스트:
0 2 * * 1-5— 평일 새벽 2시 - 의존성 보안 스캔:
0 9 * * 1— 매주 월요일 오전 9시 - 도커 이미지 정리:
0 4 * * 0— 매주 일요일 새벽 4시 - 인증서 자동 갱신:
0 0 1 * *— 매월 1일 자정
알림 / 이메일 발송
- 일간 뉴스레터:
0 8 * * 1-5— 평일 오전 8시 - 주간 요약 메일:
0 9 * * 5— 금요일 오전 9시 - 생일 축하 메시지:
0 9 * * *— 매일 오전 9시 (당일 생일 필터링) - 결제 만료 알림:
0 10 * * *— 매일 오전 10시 (7일 전 사용자 대상)
HMApps Cron 생성기 사용법
복잡한 Cron 표현식을 외우거나 매번 검색할 필요 없이, HMApps Cron 생성기를 사용하면 시각적 인터페이스로 스케줄을 설정하고 즉시 표현식을 얻을 수 있습니다.
주요 기능
- 시각적 스케줄 편집기: 분/시/일/월/요일을 체크박스와 슬라이더로 직관적으로 설정
- 프리셋 제공: "매분", "매시간", "매일 자정", "매주 월요일" 등 자주 쓰는 패턴 원클릭 선택
- 표현식 파싱: 기존 Cron 표현식을 입력하면 한글로 설명해줌
- 다음 실행 시간 미리보기: 설정한 스케줄의 다음 10회 실행 시간을 미리 확인
- 타임존 지원: KST/UTC 변환 가이드 제공
- 플랫폼별 변환: AWS EventBridge, GitHub Actions, Quartz 형식으로 변환
사용 예시: 매주 금요일 오후 6시 리포트 생성
- Cron 생성기 접속 (
/cron-generator) - 분 필드에
0입력 - 시 필드에
18입력 (오후 6시) - 일, 월 필드는
*(모든 날짜) - 요일 필드에
5입력 (금요일) - 생성된 표현식:
0 18 * * 5 - 다음 실행 시간 미리보기로 확인
Cron 표현식 디버깅 팁
1. crontab.guru 또는 HMApps Cron 생성기로 검증
작성한 표현식이 의도한 대로 동작하는지 반드시 도구로 검증하세요. 특히 복잡한 표현식일수록 "다음 실행 시간 미리보기"를 확인하는 습관이 중요합니다.
2. 로컬에서 테스트: crontab -e
# 로컬 리눅스/맥에서 crontab 편집
crontab -e
# 테스트용 1분마다 실행 (로그 파일에 타임스탬프 기록)
* * * * * echo "$(date)" >> /tmp/cron-test.log 2>&1
# 로그 확인
tail -f /tmp/cron-test.log3. 환경 변수 주의
Cron 작업은 일반 셸 세션과 달리 최소한의 환경 변수만 갖습니다. PATH에 /usr/local/bin 등이 없을 수 있으므로, 스크립트 내에서 절대 경로를 사용하거나 Cron 파일 상단에 환경 변수를 명시하세요.
# crontab 파일 상단에 환경 변수 설정
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&14. 출력을 반드시 리다이렉트
Cron 작업이 표준 출력을 내면 기본적으로 이메일로 발송됩니다 (설정에 따라). 불필요한 이메일을 막거나 로그를 남기려면 출력을 리다이렉트하세요.
# 출력 버리기
0 3 * * * /opt/scripts/backup.sh > /dev/null 2>&1
# 로그 파일에 저장 (append)
0 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&15. 실행 중복 방지 (flock 활용)
작업 실행 시간이 스케줄 간격보다 길어지면 작업이 중복 실행될 수 있습니다. flock 명령어로 동시 실행을 방지하세요.
# flock으로 중복 실행 방지
*/5 * * * * flock -n /tmp/my-job.lock /opt/scripts/my-job.sh마무리 — Cron은 인프라의 심장 박동
Cron 표현식은 처음에는 낯설지만, 핵심 패턴 몇 가지만 익히면 이후로는 직관적으로 읽고 쓸 수 있습니다. 특히 자동화가 현대 개발의 핵심인 만큼, Cron 스케줄링 능력은 백엔드 개발자, DevOps 엔지니어, 데이터 엔지니어 모두에게 필수 역량입니다.
복잡한 표현식을 직접 외울 필요 없이 HMApps Cron 생성기를 활용하세요. 시각적 인터페이스로 원하는 스케줄을 설정하고, 다음 실행 시간을 미리 확인하며, 플랫폼에 맞는 형식으로 변환까지 한 번에 해결할 수 있습니다.
자동화는 반복적인 작업에서 개발자를 해방시켜 더 창의적인 문제에 집중하게 해줍니다. 오늘부터 Cron으로 업무 자동화를 시작해보세요.