Complete Cron Expression Guide — From Linux Scheduling Basics to Practice
Cron이란?
Cron은 리눅스/유닉스 시스템에서 작업을 자동으로 반복 실행하기 위한 시간 기반 스케줄러입니다. 서버 관리자와 개발자가 백업, 로그 정리, 데이터 수집, 이메일 발송 등 정기적인 작업을 자동화할 때 가장 널리 사용하는 도구입니다. crontab(cron table) 명령어로 스케줄을 등록하고 관리합니다.
Cron은 1970년대 Unix V7에서 처음 도입된 이후 반세기 넘게 사용되고 있으며, 현재 거의 모든 리눅스 배포판과 macOS에 기본 설치되어 있습니다. 클라우드 환경에서도 AWS CloudWatch Events, Google Cloud Scheduler, GitHub Actions 등이 cron 표현식 문법을 그대로 사용합니다.
Cron 표현식의 기본 구조 — 5개 필드
Cron 표현식은 공백으로 구분된 5개 필드로 구성됩니다. 각 필드는 왼쪽부터 순서대로 다음을 의미합니다:
┌───────────── 분 (0 - 59)
│ ┌───────────── 시 (0 - 23)
│ │ ┌───────────── 일 (1 - 31)
│ │ │ ┌───────────── 월 (1 - 12)
│ │ │ │ ┌───────────── 요일 (0 - 6, 0 = 일요일)
│ │ │ │ │
* * * * *
| 필드 | 범위 | 설명 |
|---|---|---|
| 분 | 0-59 | 실행할 분 |
| 시 | 0-23 | 실행할 시 (24시간 형식) |
| 일 | 1-31 | 실행할 날짜 |
| 월 | 1-12 | 실행할 월 |
| 요일 | 0-6 | 실행할 요일 (0=일, 1=월, …, 6=토) |
예를 들어 30 9 * * *은 “매일 오전 9시 30분”을 의미합니다. 분=30, 시=9이고 나머지 필드가 *(모든 값)이므로 매일 반복됩니다.
특수문자 사용법
Cron 표현식에서는 숫자 외에 4가지 특수문자를 사용할 수 있습니다. 이 문자들을 조합하면 복잡한 스케줄도 간결하게 표현할 수 있습니다.
* (별표) — 모든 값
해당 필드의 모든 값을 의미합니다. * * * * *은 매분 실행됩니다.
/ (슬래시) — 간격
지정한 간격마다 실행합니다. */5은 “5마다”를 의미합니다.
*/5 * * * *→ 5분마다 실행 (0, 5, 10, 15, …)0 */2 * * *→ 2시간마다 정각에 실행
- (하이픈) — 범위
시작값과 끝값 사이의 모든 값을 포함합니다.
0 9-17 * * *→ 매일 9시부터 17시까지 매시 정각* * * * 1-5→ 평일(월~금)에만 매분 실행
, (쉼표) — 목록
여러 값을 나열합니다.
0 9,12,18 * * *→ 매일 9시, 12시, 18시에 실행0 0 1,15 * *→ 매월 1일과 15일 자정에 실행
조합 사용
특수문자를 조합하면 더 정교한 스케줄을 만들 수 있습니다:
0 9-17/2 * * 1-5→ 평일 9시부터 17시까지 2시간 간격으로 실행*/10 0-6 * * *→ 매일 0시부터 6시까지 10분마다 실행
실무에서 자주 쓰는 Cron 표현식 10가지
아래는 실무에서 가장 많이 사용되는 cron 표현식입니다. QuickToolkit Cron 생성기에서 직접 만들어보고 다음 실행 시간을 확인해보세요.
| # | 표현식 | 설명 |
|---|---|---|
| 1 | * * * * * | 매분 실행 |
| 2 | 0 * * * * | 매시 정각 실행 |
| 3 | 0 0 * * * | 매일 자정(00:00) 실행 |
| 4 | 0 9 * * * | 매일 오전 9시 실행 |
| 5 | 0 9 * * 1 | 매주 월요일 오전 9시 |
| 6 | 0 0 1 * * | 매월 1일 자정 |
| 7 | 0 9 * * 1-5 | 평일(월~금) 오전 9시 |
| 8 | */5 * * * * | 5분마다 |
| 9 | 0 0 * * 0 | 매주 일요일 자정 |
| 10 | 0 2 1 1 * | 매년 1월 1일 새벽 2시 |
각 표현식 상세 설명
1. 매분 실행 (* * * * *) — 모니터링, 헬스체크 등 실시간에 가까운 작업에 사용합니다. 단, 작업 실행 시간이 1분을 초과하면 중복 실행 문제가 발생할 수 있으므로 주의가 필요합니다.
2. 매시 정각 (0 * * * *) — API 데이터 수집, 캐시 갱신 등에 적합합니다. 분 필드가 0이므로 정확히 매시 0분에 실행됩니다.
3. 매일 자정 (0 0 * * *) — 데이터베이스 백업, 일간 보고서 생성, 로그 로테이션 등 일단위 배치 작업에 가장 많이 사용됩니다.
4. 평일 오전 9시 (0 9 * * 1-5) — 업무 시간에 맞춘 알림이나 보고서 발송에 적합합니다. 주말에는 실행되지 않습니다.
5. 매월 1일 (0 0 1 * *) — 월간 정산, 청구서 생성, 월간 보고서 등 월 단위 작업에 사용합니다.
Crontab 명령어 기본 사용법
리눅스에서 cron 작업을 등록하려면 crontab 명령어를 사용합니다:
# 현재 사용자의 crontab 편집
crontab -e
# 현재 등록된 crontab 목록 확인
crontab -l
# crontab 전체 삭제 (주의!)
crontab -r
crontab -e를 실행하면 텍스트 편집기가 열리고, 한 줄에 하나의 cron 작업을 작성합니다:
# 매일 새벽 2시에 백업 스크립트 실행
0 2 * * * /home/user/scripts/backup.sh
# 5분마다 헬스체크
*/5 * * * * curl -s https://example.com/health > /dev/null
# 매주 월요일 오전 9시에 보고서 생성
0 9 * * 1 python3 /home/user/scripts/report.py
주의사항 및 흔한 실수
1. 시간대(Timezone) 확인
Cron은 기본적으로 시스템의 로컬 시간대를 사용합니다. 서버의 시간대가 UTC인지 KST(한국 표준시)인지 반드시 확인하세요. AWS EC2 등 클라우드 서버는 대부분 UTC가 기본값입니다.
# 서버 시간대 확인
timedatectl
한국 시간 오전 9시에 실행하려면 서버가 UTC일 경우 0 0 * * *(UTC 0시 = KST 9시)로 설정해야 합니다.
2. 중복 실행 방지
작업 실행 시간이 cron 간격보다 길면 이전 작업이 끝나기 전에 새 작업이 시작될 수 있습니다. flock 명령어로 중복 실행을 방지할 수 있습니다:
*/5 * * * * flock -n /tmp/myjob.lock /home/user/scripts/long-task.sh
3. 환경 변수
Cron은 사용자의 로그인 셸과 다른 제한된 환경에서 실행됩니다. PATH 등의 환경 변수가 다를 수 있으므로, 스크립트 안에서 명시적으로 설정하거나 절대 경로를 사용하는 것이 좋습니다.
4. 출력 및 에러 로깅
기본적으로 cron 작업의 출력은 시스템 메일로 전송됩니다. 로그 파일로 리다이렉트하는 것이 실무에서 더 일반적입니다:
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
5. 일(day)과 요일(weekday) 동시 지정
분, 시, 월은 AND 조건이지만, 일과 요일은 OR 조건으로 동작합니다. 예를 들어 0 9 15 * 1은 “15일이거나 월요일인 날 오전 9시”를 의미하며, “15일이면서 월요일인 날”이 아닙니다. 이 점은 혼동하기 쉬우므로 주의하세요.
클라우드 환경에서의 Cron
최근에는 서버에 직접 crontab을 등록하는 대신, 클라우드 스케줄링 서비스를 많이 사용합니다:
- AWS EventBridge (CloudWatch Events):
cron(0 9 ? * MON-FRI *)형식 (6필드, 초 없이 연도 추가) - Google Cloud Scheduler: 표준 5필드 cron 표현식 사용
- GitHub Actions:
cron: '0 9 * * 1-5'형식으로 워크플로우 트리거
이들 서비스는 표준 cron 문법을 기반으로 하되 약간의 차이가 있을 수 있으므로 각 서비스의 문서를 확인하세요.
직접 만들어보기
Cron 표현식을 직접 작성하다 보면 실수하기 쉽습니다. QuickToolkit의 Cron 표현식 생성기를 사용하면 시각적으로 각 필드를 설정하고, 사람이 읽을 수 있는 설명과 다음 5회 실행 예정 시간을 바로 확인할 수 있습니다. 프리셋 버튼으로 자주 쓰는 표현식을 빠르게 선택할 수도 있으니 활용해보세요.
Cron은 배우기 쉽지만 실수도 잦은 도구입니다. 표현식을 등록하기 전에 반드시 의도한 대로 동작하는지 확인하는 습관을 들이면, 예기치 않은 작업 실행이나 누락을 방지할 수 있습니다.