맨위로가기

Cron

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Cron은 정해진 시간에 작업을 실행하도록 예약하는 데 사용되는 유닉스 기반의 작업 스케줄러이다. crontab 파일을 통해 작업 및 실행 시점을 정의하며, 분, 시, 일, 월, 요일, (선택적으로) 연도를 지정하는 형식의 표현식을 사용한다. 시스템 전체 crontab 파일은 `/etc` 또는 그 하위 디렉토리에 존재하며, 각 사용자는 `crontab -e` 명령을 통해 자신의 crontab을 생성, 편집할 수 있다. 크론은 Vixie cron, ISC Cron, mcron 등 다양한 구현이 존재하며, 시스템 부팅 시 또는 특정 시간 간격으로 작업을 실행하는 매크로를 지원한다.

광고

더 읽어볼만한 페이지

  • 유닉스 프로세스 및 작업 관리 관련 소프트웨어 - Ps (유닉스)
    `ps` 명령어는 유닉스 계열 운영체제에서 실행 중인 프로세스의 ID, CPU 사용량, 메모리 사용량, 실행 시간, 상태 등 자세한 정보를 표시하며, 파이프를 통해 다른 명령어와 결합하여 활용된다.
  • 유닉스 프로세스 및 작업 관리 관련 소프트웨어 - Top (소프트웨어)
    top은 시스템의 실시간 상태를 보여주는 프로세스 모니터링 소프트웨어 유틸리티로, CPU 사용률, 메모리 사용량, 실행 중인 프로세스 목록 등 다양한 정보를 제공한다.
  • 표준 유닉스 프로그램 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 표준 유닉스 프로그램 - Rm (유닉스)
    유닉스 명령어 `rm`은 파일을 삭제하는 데 사용되며, 옵션을 통해 삭제 동작을 제어하고 디렉터리를 재귀적으로 삭제할 수 있지만, 잘못 사용하면 시스템에 심각한 손상을 초래할 수 있어 주의가 필요하며 안전 장치나 휴지통 기능 등의 대안이 존재한다.
  • 유닉스 SUS2008 유틸리티 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 유닉스 SUS2008 유틸리티 - 로케일
    로케일은 소프트웨어 국제화 및 지역화에서 사용자 문화적 배경에 맞춰 사용 환경을 조정하는 설정으로, 표시 언어, 숫자/날짜 형식, 문자 분류, 통화 형식 등을 포함한다.

2. 구성

크론의 동작은 '''크론탭'''(cron table)이라는 설정 파일에 의해 정의된다. 크론탭은 정해진 스케줄에 따라 주기적으로 실행할 명령어를 지정하는 구성 파일이다. 크론탭 파일에는 작업 목록과 크론 데몬에 대한 기타 지시 사항이 기록되어 있다.

크론탭 파일의 각 줄은 작업을 나타내며, 일반적으로 5개의 시간 및 날짜 지정 필드와 실행할 셸 명령으로 구성된다. 시간 및 날짜 필드가 모두 현재 시간 및 날짜와 일치하면 작업이 실행되지만, "월의 날짜"와 "요일"이 모두 제한된 경우("*"를 포함하지 않음)에는 둘 중 하나만 현재 날짜와 일치해도 작업이 실행된다.[8]

일부 cron 구현은 폴 빅시가 작성했으며 많은 리눅스 배포판에 포함되어 있다. 이러한 구현은 지정된 작업을 실행하는 계정 사용자 이름(사용자 존재 및 권한에 따라 다름)인 여섯 번째 필드를 추가하기도 한다. 이는 시스템 크론탭에서만 허용되며, 각 사용자가 구성하도록 지정된 다른 크론탭에서는 허용되지 않는다.[7] Windows용 nncron 데몬은 여섯 번째 필드를 연도로 사용하기도 한다.

Amazon EventBridge 구현의 크론은 0 기반 요일을 사용하지 않고 대신 1-7 (SUN-SAT)를 사용하며, 첫 번째 요일 및 월의 마지막 날과 같은 추가 표현식 기능도 지원한다.[9]

몇 가지 예시는 다음과 같다.


  • 매일 자정 1분(00:01)에 Apache 오류 로그를 지우는 작업 (기본 셸이 본 셸을 준수한다고 가정):


```bash

1 0 * * * printf "" > /var/log/apache/error_log

```

  • 매주 토요일 23:45 (오후 11시 45분)에 export_dump.sh라는 셸 프로그램을 실행하는 작업:


```bash

45 23 * * 6 /home/oracle/scripts/export_dump.sh

```

  • 매 1, 2, 3시간의 매 5분마다 (즉, 01:00, 01:05, 01:10부터 03:55까지) "hello world"를 명령줄에 출력하는 작업:


```bash

  • /5 1,2,3 * * * echo hello world

2. 1. 파일 위치

사용자는 각자 자신만의 crontab 파일을 가질 수 있으며, 시스템 관리자만 편집할 수 있는 시스템 전체 crontab 파일은 일반적으로 `/etc` 또는 `/etc/cron.d`와 같은 하위 디렉터리에 있다.[7]

2. 2. 파일 문법

crontab 파일의 각 줄은 하나의 작업을 나타내며, 실행할 명령과 다음 5개의 필드로 구성된다.

```text

# * * * * * <실행할 명령>

# | | | | |

# | | | | 요일 (0–6) (일요일부터 토요일, 일부 시스템에서는 7도 일요일)

# | | | 월 (1–12)

# | | 월의 날짜 (1–31)

# | 시 (0–23)

# 분 (0–59)

```

각 필드는 다음을 의미한다.

필드필수허용되는 값허용되는 특수 문자비고
0〜59* , - /
0〜23* , - /
1〜31* , - ? L W /? L W는 일부 구현에서만 허용
1〜12 또는 JAN〜DEC* , - /
요일0〜6 또는 SUN〜SAT* , - ? L # /? L #는 일부 구현에서만 허용
아니오1970〜2099* , - /이 필드는 표준 및 기본 구현에서는 지원되지 않음


  • 별표(*): 모든 값을 의미한다.
  • 쉼표(,): 여러 값을 지정한다. (예: MON,WED,FRI)
  • 하이픈(-): 값의 범위를 나타낸다. (예: 2000-2010)
  • 슬래시(/): 값의 간격을 지정한다. (예: */5 는 매 5분마다)


일반적으로 시간/날짜 지정 필드가 모두 현재 시간 및 날짜와 일치할 때 작업이 실행되지만, "월의 날짜"(필드 3)와 "요일"(필드 5)이 모두 제한된 경우("*"를 포함하지 않음), 하나 또는 둘 다 현재 날짜와 일치해야 한다.[8]

일부 cron 구현에서는 여섯 번째 필드에 실행할 사용자 이름을 추가하거나,[7] 연도를 지정하는 필드를 추가하기도 한다.
특수 문자:

  • `?`: 일부 구현에서는 '값 없음'을 나타내거나 데몬 시작 시간으로 대체[43]
  • `L`: "마지막(last)"을 의미. 요일 필드에서 "마지막 금요일"(5L) 등을 지정.[42]
  • `W`: 일 필드에서 사용되며, 해당 날짜에 가장 가까운 평일(월-금)을 지정.[42]
  • `#`: 요일 필드에서 사용. 몇 번째 무슨 요일(예: 5#3 = 세 번째 금요일)을 지정.[42]
  • `H`: Jenkins에서 사용되며, 분산된 시간에 실행되도록 지정.[45]

2. 3. 권한 설정

크론 작업 사용 권한은 다음 파일에 의해 제어된다.[1]

파일명설명
/etc/cron.allow이 파일이 존재할 경우, 여기에 나열된 사용자만 크론 작업을 사용할 수 있다.
/etc/cron.deny/etc/cron.allow 파일이 없고 이 파일이 존재할 경우, 여기에 나열되지 않은 사용자만 크론 작업을 사용할 수 있다.



두 파일이 모두 존재하지 않는 경우, 시스템 설정에 따라 슈퍼유저만 크론 작업을 사용할 수 있거나 모든 사용자가 크론 작업을 사용할 수 있다.[1]

2. 4. 시간대 처리

대부분의 크론 구현은 시스템 시간대를 기준으로 crontab 항목을 해석한다. 이는 여러 사용자가 다양한 시간대에 분산되어 있는 대규모 시스템에서 문제가 될 수 있으며, 특히 시스템 기본 시간대에 일광 절약 시간제가 포함된 경우 혼란을 야기할 수 있다.

이러한 문제를 해결하기 위해, 일부 크론 구현에서는 사용자 crontab 파일에 `CRON_TZ=