Cron 표현식 설명: 구문, 예제 및 일반적인 패턴

· 12분 읽기

Cron은 Unix 계열 운영 체제에서 자동화를 지원하는 시간 기반 작업 스케줄러입니다. 데이터베이스 백업, 예약된 이메일 전송 또는 유지보수 스크립트 실행 등 무엇을 하든, cron 표현식을 이해하는 것은 모든 개발자나 시스템 관리자에게 필수적입니다.

이 포괄적인 가이드는 기본 패턴부터 고급 스케줄링 기법까지 cron 구문에 대해 알아야 할 모든 것을 설명합니다. 자신감을 가지고 cron 표현식을 작성하고, 테스트하고, 문제를 해결하는 방법을 배우게 됩니다.

목차

Cron 기본 이해하기

Cron은 Unix 계열 시스템의 백그라운드에서 지속적으로 실행되는 데몬 프로세스로, 매분마다 실행할 예약된 작업이 있는지 확인합니다. 이름은 시간을 의미하는 그리스어 "chronos"에서 유래했습니다.

시스템의 각 사용자는 예약된 작업이 포함된 자체 crontab(cron 테이블) 파일을 가질 수 있습니다. 시스템은 또한 /etc/cron.d/, /etc/cron.daily/, /etc/cron.hourly/와 같은 디렉토리에 시스템 수준 작업을 위한 crontab을 유지합니다.

cron 작업이 실행될 때, crontab을 소유한 사용자의 권한으로 실행됩니다. 이는 보안 및 파일 액세스 고려사항에 중요합니다. 작업은 일반적인 셸 구성 없이 최소한의 환경에서 실행되며, 이는 초보자에게 흔한 혼란의 원인입니다.

전문가 팁: Cron 작업은 대화형 셸 환경에 액세스할 수 없습니다. 명령과 파일에 항상 절대 경로를 사용하고, crontab에서 필요한 환경 변수를 명시적으로 설정하세요.

Cron 구문: 다섯 개의 필드

표준 cron 표현식은 다섯 개의 시간 및 날짜 필드와 실행할 명령으로 구성됩니다. 이러한 필드를 이해하는 것은 효과적인 cron 스케줄을 작성하는 데 기본입니다.

┌───────────── 분 (0-59)
│ ┌───────────── 시 (0-23)
│ │ ┌───────────── 일 (1-31)
│ │ │ ┌───────────── 월 (1-12 또는 JAN-DEC)
│ │ │ │ ┌───────────── 요일 (0-7, 0과 7 = 일요일, 또는 SUN-SAT)
│ │ │ │ │
* * * * * 실행할 명령

각 필드는 작업이 실행되는 시기를 제어하는 특정 값과 특수 문자를 허용합니다. 각 필드가 나타내는 것을 분석해 보겠습니다:

필드 범위 특수 문자 설명
0-59 * , - / 작업이 실행되는 정확한 분
0-23 * , - / 24시간 형식의 시간 (0 = 자정)
1-31 * , - / L W 월의 일
1-12 또는 JAN-DEC * , - / 연도의 월 (1 = 1월)
요일 0-7 또는 SUN-SAT * , - / L # 주의 요일 (0과 7 = 일요일)

명령 필드는 유효한 셸 명령, 스크립트 경로 또는 세미콜론으로 구분된 일련의 명령이 될 수 있습니다. cron 작업의 출력은 리디렉션되지 않는 한 일반적으로 사용자에게 이메일로 전송됩니다.

특수 문자 및 연산자

Cron의 강력함은 유연한 스케줄링 패턴을 허용하는 특수 문자에서 나옵니다. 이러한 연산자를 마스터하면 복잡한 로직 없이 정교한 스케줄을 만들 수 있습니다.

별표 (*) - 모든 값 일치

별표는 필드의 모든 가능한 값과 일치하는 와일드카드 문자입니다. 필드에 *를 사용하면 해당 필드 범위의 모든 값에 대해 작업이 실행됩니다.

예를 들어, * * * * *는 "매월 매일 매시간 매분"을 의미합니다 - 즉, 매분마다 실행됩니다.

쉼표 (,) - 여러 값 나열

쉼표를 사용하면 여러 개별 값을 지정할 수 있습니다. 특정하고 연속되지 않은 시간이 필요할 때 유용합니다.

예: 0 9,12,15,18 * * *는 매일 오전 9시, 정오, 오후 3시, 오후 6시에 실행됩니다.

하이픈 (-) - 범위 정의

하이픈은 포괄적인 값 범위를 만듭니다. 쉼표로 많은 연속 값을 나열하는 것보다 깔끔합니다.

예: 0 9-17 * * 1-5는 월요일부터 금요일까지 오전 9시부터 오후 5시까지 매시간 실행됩니다 (업무 시간).

슬래시 (/) - 단계 값

슬래시 연산자는 단계 간격을 지정합니다. 구문은 */n 또는 범위/n이며, 여기서 n은 단계 값입니다.

예: */15 * * * *는 15분마다 실행됩니다 (:00, :15, :30, :45). 범위도 사용할 수 있습니다: 0-30/5 * * * *는 매시간 전반부 동안 5분마다 실행됩니다.

확장 문자 (L, W, #)

이들은 Vixie cron 및 Quartz 스케줄러와 같은 일부 cron 구현에서 지원되는 비표준 확장이지만 표준 Unix cron에서는 지원되지 않습니다.

문자 의미 예제 설명
L 마지막 0 0 L * * 월의 마지막 날 자정
W 평일 0 0 15W * * 15일에 가장 가까운 평일
# N번째 발생 0 0 * * 5#3 매월 세 번째 금요일

빠른 팁: L, W 또는 # 문자를 사용하기 전에 cron 구현이 이를 지원하는지 확인하세요. 표준 Unix cron은 이러한 표현식을 거부합니다. 호환성을 테스트하려면 Cron 표현식 생성기를 사용하세요.

일반적인 Cron 패턴

실제 애플리케이션에서 가장 자주 사용되는 cron 패턴입니다. 이들은 일반적인 자동화 작업의 대부분의 스케줄링 요구사항을 다룹니다.

기본 시간 간격

일일 스케줄

주간 스케줄

월간 및 연간 스케줄

전문가 팁: 월간 작업을 스케줄링할 때 28보다 큰 일 값에 주의하세요. 0 0 31 * *를 사용하면 31일이 있는 월에만 실행됩니다. 월말 작업의 경우 이전 달의 마지막 날이나 다음 달의 첫날을 사용하는 것을 고려하세요.

Cron 표현식 파서를 사용하여 cron 표현식을 테스트하고 검증하여 작업이 정확히 언제 실행될지 확인하세요.

고급 스케줄링 기법

기본 패턴을 넘어 연산자와 필드를 결합하여 복잡한 비즈니스 요구사항에 맞는 정교한 스케줄을 만들 수 있습니다.

여러 조건 결합

단일 필드에서 여러 연산자를 사용하여 미묘한 스케줄을 만들 수 있습니다. 예를 들어, 0 9,12,15 * * 1-5는 오전 9시, 정오, 오후 3시에 실행되지만 평일에만 실행됩니다.

다른 예: */10 8-17 * * 1-5는 10분마다 실행되지만 평일 업무 시간 (오전 8시 - 오후 5시) 동안만 실행됩니다.

일 대 요일

일과 요일이 모두 지정되면 (*가 아닌 경우), 작업은 둘 중 하나의 조건이 충족될 때 실행됩니다 (AND 논리가 아닌 OR 논리). 이는 흔한 혼란의 원인입니다.

예를 들어, 0 0 13 * 5는 매월 13일 자정 또는 매주 금요일에 실행되며, 13일의 금요일에만 실행되는 것이 아닙니다.

13일의 금요일에 특별히 무언가를 스케줄하려면 두 조건을 모두 확인하는 스크립트를 사용해야 합니다:

0 0 13 * * [ $(date +\%u) -eq 5 ] && /path/to/script.sh

범위와 함께 단계 값 사용

정밀한 제어를 위해 범위와 단계 값을 결합할 수 있습니다. 시작-끝/단계 구문은 특정 범위 내에서 간격으로 실행됩니다.

예: