Dandy Now!
  • [Linux] 크론(Cron) 표현식 완벽 가이드: 자동화 작업 스케줄링 마스터하기
    2025년 03월 19일 11시 12분 20초에 업로드 된 글입니다.
    이 글은 2025년 03월 19일 02시 16분 25초에 마지막으로 수정되었습니다.
    작성자: DandyNow
    728x90
    반응형

    크론(Cron) 표현식 완벽 가이드: 자동화 작업 스케줄링 마스터하기

    크론(Cron)은 유닉스 계열 운영체제에서 특정 작업을 정해진 시간에 자동으로 실행하도록 예약하는 시간 기반 작업 스케줄러이다. 크론 표현식을 이해하면 시스템 관리, 데이터 백업, 정기적인 알림 등 다양한 작업을 자동화할 수 있다. 이 글에서는 크론 표현식의 모든 것을 상세히 설명하고, 다양한 예시와 활용법을 제공한다.

    1. 크론 표현식의 구조

    크론 표현식은 공백으로 구분된 5개 또는 6개의 필드로 구성된다. 각 필드는 특정 시간 단위를 나타내며, 순서는 다음과 같다.

    1. 초 (Seconds): 0부터 59 사이의 값
    2. 분 (Minutes): 0부터 59 사이의 값
    3. 시간 (Hours): 0부터 23 사이의 값
    4. 일 (Day of Month): 1부터 31 사이의 값
    5. 월 (Month): 1부터 12 사이의 값 또는 영문 약자 (JAN, FEB, MAR 등)
    6. 요일 (Day of Week): 0부터 7 사이의 값 (0과 7은 일요일) 또는 영문 약자 (SUN, MON, TUE 등)

    2. 특수 문자

    크론 표현식에서는 다음과 같은 특수 문자를 사용하여 다양한 시간 간격을 설정할 수 있다.

    • 별표 (*): 해당 필드의 모든 값을 의미(예: 매분, 매시간)
    • 슬래시 (/): 값의 범위를 설정(예: */5는 5분마다)
    • 콤마 (,): 여러 값을 나열(예: 1,3,5는 1일, 3일, 5일)
    • 하이픈 (-): 값의 범위를 지정(예: 9-17은 9시부터 17시까지)
    • 물음표 (?): 특정 필드를 지정하지 않음을 의미하며, 주로 '일'과 '요일' 필드에서 사용
    • L: '일' 또는 '요일' 필드에서 사용되며, 마지막 날 또는 마지막 요일을 의미
    • W: '일' 필드에서 사용되며, 가장 가까운 평일을 의미
    • #: '요일' 필드에서 사용되며, 특정 요일의 몇 번째 주를 의미

    3. 크론 표현식 필드 정보

    필드 허용 범위 허용된 특수 문자 설명
    초 (Seconds) 0-59 *, ,, -, / 작업을 실행할 를 지정
    분 (Minutes) 0-59 *, ,, -, / 작업을 실행할 을 지정
    시간 (Hours) 0-23 *, ,, -, / 작업을 실행할 시간을 지정
    일 (Day of Month) 1-31 *, ,, -, /, L, W, ? 작업을 실행할 날짜를 지정
    월 (Month) 1-12 또는 JAN-DEC *, ,, -, / 작업을 실행할 을 지정
    요일 (Day of Week) 0-7 또는 SUN-SAT (0 또는 7은 일요일) *, ,, -, /, L, #, ? 작업을 실행할 요일을 지정(요일 지정에 대한 보다 상세한 내용은 5. 요일별 표기법 상세를 참조)

    4. 크론 표현식 예시

    유의) 이 예시에서 는 생략했다.

    4-1. 자주 사용되는 기본 예시

    크론식 설명 사용 사례
    * * * * * 매 분마다 실행 시스템 상태 점검, 실시간 로그 수집
    0 0 * * * 매일 0시 0분에 실행 데이터 백업, 로그 정리, 일일 리포트 생성
    0 9 * * 1-5 월~금요일 9시 0분에 실행 업무 시작 알림, 정기 보고서 전송
    0 0 1,15 * * 매달 1일과 15일 0시 0분에 실행 급여 정산, 중간/월말 정기 보고서
    */5 * * * * 5분마다 실행 서비스 헬스 체크, 자동화된 데이터 수집

    4-2. 특수 문자를 활용한 고급 예시

    크론식 설명 사용 사례
    0 0 28-31 * * (스크립트로 마지막 날 판별) 매월 마지막 날 0시 0분에 실행 월말 정산, 월말 보고서 생성
    0 0 1W * * (스크립트로 평일 보정) 매월 1일이 주말이면 가장 가까운 평일 0시 0분에 실행 월초 업무 자동화, 계약서 갱신
    0 0 ? * 2#3 (Quartz 사용) 매월 세 번째 월요일 0시 0분에 실행 월례 회의 준비, 정기 점검
    0 30 8-17/2 * * 1-5 월~금요일 08:30부터 17:30까지 2시간 간격으로 실행 근무 시간 중 정기적인 데이터 수집
    0 0 1,15,28-31 * * (스크립트로 마지막 날 판별) 매월 1일, 15일, 마지막 날 0시 0분에 실행 급여 계산, 월간 보고서 작성
    0 0 ? * 2#1 (Quartz 사용) 매월 첫 번째 월요일 0시 0분에 실행 월초 팀 미팅 준비, 정기 점검
    0 0 24-31 * * 5 (스크립트로 마지막 금요일 판별) 매월 마지막 금요일 0시 0분에 실행 월말 마감, 급여 이체 처리
    • 리눅스 기본 cron을 사용할 경우, L, W, # 연산자를 직접 사용할 수 없으므로 날짜 범위를 설정하고 스크립트로 보완해야 한다(구체적인 사례는 8. 스크립트 예시를 참조).
    • Quartz cron을 사용할 경우, ?, #, L을 그대로 사용할 수 있다!

    5. 요일 표기법 상세

    5-1. 요일 표기법

    요일 숫자 표기 문자 표기
    일요일 0 또는 7 SUN
    월요일 1 MON
    화요일 2 TUE
    수요일 3 WED
    목요일 4 THU
    금요일 5 FRI
    토요일 6 SAT

    5-2. 특수 기호와 요일 조합

    기호 설명
    L 해당 월의 마지막 날짜 (예: 5L → 마지막 금요일)
    # 특정 주의 특정 요일 (예: 1#3 → 세 번째 월요일)
    ? 날짜 필드(day of month)를 무시하고 요일 기준으로 실행

    5-3. 예시

    크론식 설명
    0 0 * * 1 매주 월요일 0시 0분에 실행
    0 0 ? * 5L 매월 마지막 금요일 0시 0분에 실행
    0 0 ? * MON#1 매월 첫 번째 월요일 0시 0분에 실행
    0 12 * * 2,4 매주 화요일과 목요일 12시에 실행

    요일을 사용할 때 ? 또는 *을 적절히 활용하는 것이 중요하다!

    6. 크론 작업의 활용

    크론은 다음과 같은 다양한 작업 자동화에 활용된다.

    • 시스템 백업
    • 로그 파일 정리
    • 데이터베이스 유지 관리
    • 정기적인 이메일 발송
    • 웹사이트 데이터 업데이트
    • 정기적인 시스템 점검
    • 데이터 동기화 및 백업
    • 정기적인 알림 및 보고서 생성

    7. 주의사항

    • '일'과 '요일' 필드는 동시에 사용할 수 없다. 둘 중 하나를 지정하면 다른 하나는 ?를 사용하여 무시해야 한다.
    • 일부 크론 구현체에서는 '초' 필드를 생략할 수 있다.

    8. 스크립트 예시

    리눅스 기본 cron에서는 L, W, # 연산자를 직접 사용할 수 없으므로 스크립트로 날짜를 계산하여 보완해야 한다.

    8-1. 스크립트로 매월 마지막 날 실행하기

    (0 0 L * * 대체)

    #!/bin/bash
    # 오늘 날짜에서 다음 달 1일의 하루 전 날짜를 계산 (즉, 이번 달의 마지막 날)
    LAST_DAY=$(date -d "$(date +%Y-%m-01) +1 month -1 day" +%d)
    # 오늘 날짜가 마지막 날인지 확인
    if [[ $(date +%d) -eq $LAST_DAY ]]; then
    # 실행할 명령어 (예: 로그 정리)
    echo "오늘은 마지막 날입니다. 작업을 실행합니다."
    # 여기에 실행할 명령어 입력
    fi

    cron 등록 방법

    0 0 * * * /path/to/script.sh

    설명:

    • date -d "$(date +%Y-%m-01) +1 month -1 day" +%d → 이번 달의 마지막 날을 계산
    • if [[ $(date +%d) -eq $LAST_DAY ]]; then ... fi → 현재 날짜가 마지막 날이면 스크립트 실행

    8-2. 스크립트로 매월 마지막 금요일 실행하기

    (0 0 5L * * 대체)

    #!/bin/bash
    # 오늘이 금요일인지 확인
    if [[ $(date +%u) -eq 5 ]]; then
    # 이번 달의 마지막 금요일인지 확인
    NEXT_FRIDAY=$(date -d "next Friday" +%m)
    CURRENT_MONTH=$(date +%m)
    if [[ "$NEXT_FRIDAY" != "$CURRENT_MONTH" ]]; then
    echo "오늘은 마지막 금요일입니다. 작업을 실행합니다."
    # 실행할 작업 추가
    fi
    fi

    cron 등록

    0 0 * * 5 /path/to/last_friday_script.sh

    설명:

    • date +%u → 현재 요일을 숫자로 반환 (5는 금요일)
    • date -d "next Friday" +%m → 다음 금요일이 이번 달인지 확인하여 마지막 금요일 판별

    8-3. 스크립트로 매월 첫 번째 월요일 실행하기

    (0 0 ? * MON#1 대체)

    #!/bin/bash
    # 현재 날짜가 1일부터 7일 사이인지 확인
    if [[ $(date +%d) -le 7 ]] && [[ $(date +%u) -eq 1 ]]; then
    echo "오늘은 첫 번째 월요일입니다. 작업을 실행합니다."
    # 실행할 작업 추가
    fi

    cron 등록

    0 0 * * 1 /path/to/first_monday_script.sh

    설명:

    • date +%d → 현재 날짜가 1~7일 범위에 있는지 확인
    • date +%u → 현재 요일이 월요일(1)인지 확인
    728x90
    반응형
    댓글