← 블로그 개발

Cron 표현식 완벽 가이드: 스케줄링의 핵심

2026년 2월 22일 · 7분 읽기

서버를 운영하다 보면 반복 작업을 자동화해야 할 때가 반드시 찾아옵니다. 매일 새벽에 데이터베이스를 백업하거나, 매시간 캐시를 비우거나, 매주 월요일 아침에 리포트를 생성하는 식이죠. 이런 작업 스케줄링의 핵심에 바로 Cron 표현식이 있습니다.

Cron이란 무엇인가

Cron은 유닉스 계열 운영체제에서 시간 기반 작업 스케줄링을 담당하는 데몬(백그라운드 프로세스)입니다. 1975년 AT&T 벨 연구소에서 처음 개발되었고, 지금까지 리눅스와 macOS에서 표준으로 사용되고 있어요. 이름은 그리스어로 "시간"을 뜻하는 "Chronos"에서 따왔습니다.

Cron 표현식은 이 Cron 데몬에게 "언제 실행할지"를 알려주는 문법입니다. 짧은 문자열 하나로 매우 다양한 스케줄을 표현할 수 있다는 게 큰 장점이에요.

5개 필드 구조 이해하기

표준 Cron 표현식은 공백으로 구분된 5개의 필드로 구성됩니다. 각 필드가 무엇을 의미하는지 하나씩 살펴볼게요.

분 (0-59): 작업이 실행될 분을 지정합니다. 0이면 정각, 30이면 30분에 실행됩니다.

시 (0-23): 24시간 형식으로 시간을 지정합니다. 0은 자정, 13은 오후 1시입니다.

일 (1-31): 월의 몇 번째 날인지 지정합니다. 1이면 매월 1일입니다.

월 (1-12): 실행할 월을 지정합니다. 1은 1월, 12는 12월이에요.

요일 (0-7): 0과 7 모두 일요일이고, 1은 월요일, 6은 토요일입니다.

예를 들어 30 9 * * 1은 "매주 월요일 오전 9시 30분"을 의미합니다.

특수문자 완벽 정리

Cron 표현식의 진짜 힘은 특수문자에서 나옵니다. 네 가지만 기억하면 돼요.

별표(*): "모든 값"을 의미합니다. 분 필드에 *를 쓰면 매분, 시 필드에 쓰면 매시간이에요.

쉼표(,): 여러 값을 나열할 때 씁니다. 1,3,5는 "1과 3과 5"를 뜻해요. 요일 필드에 1,3,5를 쓰면 월, 수, 금요일입니다.

하이픈(-): 범위를 지정합니다. 1-5는 "1부터 5까지"예요. 요일 필드에 쓰면 월요일부터 금요일까지를 의미합니다.

슬래시(/): 간격을 지정합니다. */5는 "5마다"를 뜻해요. 분 필드에 */10을 쓰면 10분 간격으로 실행됩니다.

자주 쓰는 Cron 표현식 모음

실무에서 가장 많이 사용하는 패턴들을 정리했습니다. 바로 복사해서 쓸 수 있어요.

매분 실행: * * * * * - 테스트나 실시간 모니터링에 사용합니다.

매시간 정각: 0 * * * * - 로그 수집이나 상태 체크에 적합해요.

매일 자정: 0 0 * * * - 일일 백업, 로그 로테이션에 많이 씁니다.

매일 오전 6시: 0 6 * * * - 아침 리포트 발송에 좋습니다.

매주 월요일 오전 9시: 0 9 * * 1 - 주간 리포트 생성용이에요.

매월 1일 자정: 0 0 1 * * - 월간 정산이나 통계 집계에 활용합니다.

평일 오전 8시: 0 8 * * 1-5 - 근무일에만 실행이 필요할 때 사용해요.

5분마다: */5 * * * * - API 폴링이나 헬스 체크에 자주 쓰입니다.

매 30분마다: */30 * * * * - 데이터 동기화에 적합합니다.

crontab 명령어 사용법

리눅스에서 Cron 작업을 관리할 때는 crontab 명령어를 사용합니다.

현재 등록된 작업 확인: crontab -l

작업 편집: crontab -e - 기본 에디터가 열리면 표현식과 실행할 명령어를 한 줄에 작성합니다.

모든 작업 삭제: crontab -r - 주의해서 사용하세요. 확인 없이 바로 삭제됩니다.

작업을 등록할 때는 0 2 * * * /home/user/backup.sh처럼 표현식 뒤에 실행할 스크립트 경로를 적어주면 됩니다. 환경변수가 로드되지 않을 수 있으니 절대 경로를 사용하는 게 안전해요.

실전 활용 사례

로그 파일 정리: 서버 로그가 쌓이면 디스크 공간을 잡아먹습니다. 매일 새벽 3시에 7일 이상 된 로그를 삭제하면 깔끔하게 관리할 수 있어요. 0 3 * * * find /var/log -name "*.log" -mtime +7 -delete

데이터베이스 백업: 데이터 손실은 정말 치명적이죠. 매일 새벽 2시에 DB 덤프를 만들어 백업 서버로 전송하는 방식이 일반적입니다.

캐시 갱신: Redis나 Memcached 같은 캐시를 사용하는 서비스에서 주기적으로 캐시를 워밍업하면 사용자 경험이 좋아집니다. 1시간마다 인기 데이터를 캐시에 미리 올려놓는 식이에요.

SSL 인증서 갱신: Let's Encrypt를 쓴다면 인증서 만료 전에 자동 갱신이 필수입니다. 매월 1일과 15일에 갱신을 시도하면 안전해요.

주의사항과 팁

서버 시간대 확인: Cron은 서버의 시스템 시간대를 따릅니다. UTC로 설정된 서버에서 한국 시간 기준으로 스케줄을 잡으려면 9시간 차이를 고려해야 해요. 실수하기 쉬운 부분이니 꼭 확인하세요.

중복 실행 방지: 작업 실행 시간이 예상보다 길어지면 다음 스케줄과 겹칠 수 있습니다. flock 같은 잠금 메커니즘을 사용하면 동시에 같은 작업이 두 번 돌아가는 걸 막을 수 있어요.

로그 남기기: Cron 작업은 백그라운드에서 돌아가기 때문에 문제가 생겨도 알기 어렵습니다. 실행 결과를 파일에 기록하거나 메일로 전송하도록 설정해 두세요.

테스트는 짧은 간격으로: 새 Cron 작업을 등록할 때는 처음에 매분 실행으로 설정해서 제대로 동작하는지 확인한 뒤, 원하는 주기로 바꾸는 게 안전합니다.

Cron 표현식이 처음에는 암호처럼 보이지만, 5개 필드의 의미와 특수문자 네 개만 기억하면 어떤 스케줄이든 자유롭게 만들 수 있습니다. 직접 표현식을 만들어 보고 싶다면 아래 도구를 활용해 보세요.

자주 묻는 질문

Cron 표현식을 테스트하는 방법은?

운영 서버에 바로 올리는 대신 표현식을 파싱해 다음 실행 시각을 미리 뽑아보는 게 안전하다. Cron 생성기에 표현식을 넣으면 앞으로의 실행 시각 목록을 확인할 수 있다. 서버에서 검증할 때는 실제 작업 대신 날짜만 로그에 남기는 더미 스크립트를 같은 표현식으로 하루 돌려보는 방법을 많이 쓴다.

가장 자주 쓰는 Cron 표현식은?

0 * * * *는 매시 정각, 0 0 * * *는 매일 자정, 0 3 * * *는 매일 새벽 3시로 백업 작업의 관례적인 시각이다. */5 * * * *는 5분마다, 0 0 * * 1은 매주 월요일 자정, 0 0 1 * *은 매월 1일에 실행된다. 배치 작업이 여러 개라면 7 3 * * *처럼 분을 조금씩 어긋나게 두어 정각 부하 집중을 피하는 것이 좋다.

Cron 작업이 실패하면 어떻게 되나요?

cron은 재시도하지 않는다. 실패한 회차는 그대로 건너뛰고 다음 예정 시각을 기다릴 뿐이다. 게다가 실행 결과를 시스템 메일로 보내는 것이 기본 동작이라, 메일이 설정돼 있지 않으면 오류 메시지가 조용히 사라진다. 스크립트 안에서 종료 코드를 직접 확인해 로그 파일로 남기거나, 작업 완료 시 외부 헬스체크 서비스에 신호를 보내 미실행을 감지하도록 만드는 것이 일반적이다.

서버 시간대와 Cron의 관계는?

cron은 시스템 시간대를 그대로 따른다. UTC로 설정된 서버에 0 9 * * *을 넣으면 한국 시간으로는 오후 6시에 실행된다. date 명령으로 서버 시간대를 먼저 확인하고, crontab 상단에 CRON_TZ=Asia/Seoul을 선언하거나 표현식 자체를 UTC 기준으로 환산해 넣어야 한다. 서머타임을 적용하는 지역이라면 새벽 2~3시대 작업이 건너뛰어지거나 두 번 실행될 수 있다는 점도 감안해야 한다.