자주 쓰는 Cron 표현식 예제와 다음 실행 시간 확인법
다섯 필드의 의미, 자주 쓰는 표현식 모음, 일과 요일을 함께 쓸 때 생기는 함정을 정리했습니다.
다섯 개의 필드
cron 표현식은 공백으로 구분된 다섯 개의 필드로 실행 시점을 표현합니다. 순서대로 분, 시, 일, 월, 요일입니다.
분은 0부터 59, 시는 0부터 23, 일은 1부터 31, 월은 1부터 12, 요일은 0부터 6이며 0이 일요일입니다. 구현체에 따라 7도 일요일로 받아들입니다.
각 필드에는 네 가지 표기를 쓸 수 있습니다. 별표는 모든 값을 의미하고, 슬래시는 간격을 지정하며(*/5 는 5마다), 하이픈은 범위를(1-5), 쉼표는 목록을(1,15) 나타냅니다. 이 조합만으로 실무에 필요한 대부분의 주기를 표현할 수 있습니다.
자주 쓰는 표현식
아래 표현식들은 실무에서 반복적으로 등장하는 형태입니다.
- */5 * * * * — 5분마다. 헬스체크나 짧은 주기의 동기화에 사용합니다.
- 0 * * * * — 매시 정각. 시간 단위 집계 작업에 씁니다.
- 0 3 * * * — 매일 새벽 3시. 백업과 배치 정리 작업의 단골 시각입니다.
- 0 9 * * 1-5 — 평일 오전 9시. 업무일 기준 알림에 사용합니다.
- 0 0 1 * * — 매월 1일 자정. 월간 정산이나 리포트 생성에 씁니다.
- 30 2 * * 0 — 매주 일요일 새벽 2시 30분. 주간 유지보수 작업에 적합합니다.
일과 요일을 함께 쓰면 생기는 함정
가장 많이 오해하는 부분입니다. 일 필드와 요일 필드를 모두 지정하면 표준 cron은 두 조건을 AND가 아니라 OR로 처리합니다.
예를 들어 0 0 1 * 1 은 매월 1일에 실행되면서 동시에 모든 월요일에도 실행됩니다. 매월 1일이 월요일일 때만 실행되기를 기대했다면 결과가 전혀 다릅니다.
두 조건을 모두 만족할 때만 실행하려면 cron에서는 한쪽만 지정하고 스크립트 안에서 나머지 조건을 검사하는 방식이 일반적입니다. 예를 들어 매주 월요일로 스케줄을 잡고 스크립트 첫 줄에서 오늘이 1일인지 확인해 아니면 종료하는 식입니다.
예상한 시각에 실행되지 않을 때
표현식이 맞는데도 작업이 안 도는 경우, 대개 cron 자체가 아니라 주변 환경이 원인입니다.
- 서버 타임존: cron은 서버의 시간대를 따릅니다. 서버가 UTC면 표현식의 시각도 UTC 기준입니다.
- 환경 변수: cron이 실행하는 셸은 로그인 셸과 환경이 다릅니다. PATH가 짧아 명령을 찾지 못하는 경우가 흔하므로 절대 경로를 쓰는 것이 안전합니다.
- 실행 중복: 이전 작업이 끝나지 않았는데 다음 주기가 시작되어 겹치는 경우입니다. 잠금 파일이나 flock으로 중복 실행을 막아야 합니다.
- 표준 출력: cron은 출력이 있으면 메일로 보내려 시도합니다. 로그 파일로 리다이렉트해 두지 않으면 원인 파악이 어렵습니다.
- 필드 개수: Spring이나 Quartz는 초 필드가 추가된 여섯 자리를 씁니다. 다섯 자리 표현식을 그대로 넣으면 의미가 밀립니다.