서버를 운영하다 보면 반복 작업을 자동화해야 할 때가 반드시 찾아옵니다. 매일 새벽에 데이터베이스를 백업하거나, 매시간 캐시를 비우거나, 매주 월요일 아침에 리포트를 생성하는 식이죠. 이런 작업 스케줄링의 핵심에 바로 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 작업이 실패하면 어떻게 되나요?
이 주제에 대한 자세한 내용은 위 본문을 참고하시거나, 관련 도구를 직접 사용해 보세요.
서버 시간대와 Cron의 관계는?
이 주제에 대한 자세한 내용은 위 본문을 참고하시거나, 관련 도구를 직접 사용해 보세요.