Cron

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

1. 개요

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

Cron - [IT 관련 정보]에 관한 문서
개요
유형유닉스 계열 운영체제용 작업 스케줄러
개발자AT&T 벨 연구소
발표일1975년 5월
프로그래밍 언어C 언어
운영 체제유닉스
유닉스 계열
Plan 9
Inferno
장르작업 관리 시스템
상세 정보
용도유닉스 계열 컴퓨터 운영 체제에서 시간 기반 작업 스케줄러로 사용됨
기능미리 정해진 시간에 특정 작업 (명령 또는 스크립트)을 자동으로 실행
어원그리스어 "Chronos" (시간)에서 유래
구성 요소cron 데몬 (백그라운드 프로세스)
crontab (cron 테이블) - 작업 목록 파일
crontab 편집 명령어crontab -e
cron 작업 정의 형식분 시 일 월 요일 명령
예시0 0 * * * /path/to/script.sh (매일 자정에 script.sh 실행)
관련 용어cronjob
anacron
📚 더 읽어볼만한 페이지
  • 유닉스 프로세스 및 작업 관리 관련 소프트웨어 - Ps (유닉스)
    `ps` 명령어는 유닉스 계열 운영체제에서 실행 중인 프로세스의 ID, CPU 사용량, 메모리 사용량, 실행 시간, 상태 등 자세한 정보를 표시하며, 파이프를 통해 다른 명령어와 결합하여 활용된다.
  • 유닉스 프로세스 및 작업 관리 관련 소프트웨어 - Top (소프트웨어)
    top은 시스템의 실시간 상태를 보여주는 프로세스 모니터링 소프트웨어 유틸리티로, CPU 사용률, 메모리 사용량, 실행 중인 프로세스 목록 등 다양한 정보를 제공한다.
  • 표준 유닉스 프로그램 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 표준 유닉스 프로그램 - Rm (유닉스)
    유닉스 명령어 `rm`은 파일을 삭제하는 데 사용되며, 옵션을 통해 삭제 동작을 제어하고 디렉터리를 재귀적으로 삭제할 수 있지만, 잘못 사용하면 시스템에 심각한 손상을 초래할 수 있어 주의가 필요하며 안전 장치나 휴지통 기능 등의 대안이 존재한다.
  • 유닉스 SUS2008 유틸리티 - AWK
    AWK는 1977년에 개발된 텍스트 처리 및 프로그래밍 언어로, 유닉스 환경에서 텍스트 처리를 위해 설계되었으며 정규 표현식 처리 기능을 통해 텍스트 분석, 데이터 추출, 보고서 생성 등 다양한 작업을 수행한다.
  • 유닉스 SUS2008 유틸리티 - 로케일
    로케일은 소프트웨어 국제화 및 지역화에서 사용자 문화적 배경에 맞춰 사용 환경을 조정하는 설정으로, 표시 언어, 숫자/날짜 형식, 문자 분류, 통화 형식 등을 포함한다.

2. 구성

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

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

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

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

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

* 매일 자정 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`와 같은 하위 디렉터리에 있다.

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)이 모두 제한된 경우("*"를 포함하지 않음), 하나 또는 둘 다 현재 날짜와 일치해야 한다.

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

특수 문자:

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

2.3. 권한 설정

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

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


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

2.4. 시간대 처리

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

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

3. 예제

크론의 작업은 크론탭(cron table) 파일이라는 구성 파일을 통해 실행된다. 이 파일은 지정된 일정에 따라 정기적으로 실행할 명령을 지정한다. 크론탭 파일은 작업 목록과 크론 데몬에 대한 기타 지침이 보관되는 곳에 저장된다. 사용자는 개별 크론탭 파일을 가질 수 있으며, 시스템 관리자만 편집할 수 있는 시스템 전체 크론탭 파일(일반적으로 `/etc` 또는 `/etc`의 하위 디렉토리)이 있는 경우가 많다.

크론탭 파일의 각 줄은 작업을 나타내며 다음과 같은 구조를 가진다.

```text
# * * * * * <실행할 명령>
# | | | | |
# | | | | 요일 (0–6) (일요일부터 토요일;
# | | | 월 (1–12) 일부 시스템에서는 7도 일요일)
# | | 월의 날짜 (1–31)
# | 시 (0–23)
# 분 (0–59)
```

각 줄은 명령을 실행할 시간과 날짜를 나타내는 5개의 필드로 구성된 크론 표현식과 실행할 셸 명령으로 구성된다.

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

다음은 몇 가지 예시이다.

* 매일 자정 1분(00:01)에 Apache 오류 로그를 지운다.

```text
1 0 * * * printf "" > /var/log/apache/error_log
```
* 매주 토요일 23:45 (오후 11시 45분)에 `export_dump.sh`라는 셸 프로그램을 실행한다.

```text
45 23 * * 6 /home/oracle/scripts/export_dump.sh
```
* 매 1, 2, 3시간의 매 5분마다 (즉, 01:00, 01:05, 01:10부터 03:55까지) "hello world"를 명령줄에 출력한다.

```text
*/5 1,2,3 * * * echo hello world
```

사용자 구성 파일은 `crontab -e` 명령을 호출하여 편집할 수 있다.

일부 `cron` 구현은 지정된 작업을 실행하는 계정 사용자 이름인 여섯 번째 필드를 추가한다. 이는 시스템 크론탭에서만 허용된다. 여섯 번째 필드는 계정 사용자 이름 대신 연도로 사용되기도 한다.

4. 비표준 매크로

일부 크론 구현은 다음과 같은 비표준 매크로를 지원한다.

👆
좌우로 밀어서 보기
항목설명동일한 항목
@yearly (또는 @annually)매년 1월 1일 자정에 한 번 실행0 0 1 1 *
@monthly매달 첫날 자정에 한 번 실행0 0 1 * *
@weekly매주 일요일 자정에 한 번 실행0 0 * * 0
@daily (또는 @midnight)매일 자정에 한 번 실행0 0 * * *
@hourly매시간 시작 시 한 번 실행0 * * * *
@reboot시작 시 실행


@reboot는 데몬이 시작될 때 한 번 실행되도록 작업을 구성한다. 크론은 일반적으로 재시작되지 않으므로 이는 일반적으로 시스템 부팅에 해당한다. 이 동작은 데비안에서 제공되는 것과 같은 일부 크론 변형에서 적용되므로 데몬을 단순히 다시 시작하는 것만으로는 @reboot 작업이 다시 실행되지 않는다.

@reboot는 특정 사용자로 서버 또는 데몬을 시작해야 하고 해당 사용자가 프로그램을 시작하도록 init을 구성할 수 없는 경우 유용할 수 있다.

5. 역사

Version 7 유닉스에서 처음 등장한 크론은 운영 체제가 다중 사용자 모드로 진입할 때 `/etc/rc`에서 호출되는 시스템 서비스(데몬)였다. 이후 유닉스 시스템 V의 출시와 함께 슈퍼유저뿐만 아니라 유닉스 시스템의 모든 사용자가 사용할 수 있도록 기능이 확장되었다.

GNU 프로젝트와 리눅스의 등장으로 새로운 크론이 나타났는데, 가장 널리 사용되는 것은 1987년 폴 빅시가 처음 코딩한 Vixie cron이다.

5.1. 초기 버전

Version 7 유닉스의 크론은 운영 체제가 다중 사용자 모드로 진입할 때 `/etc/rc`에서 호출되는 시스템 서비스(데몬)였다. 이의 알고리즘은 간단했다.

1. `/usr/lib/crontab`을 읽는다.
2. 현재 날짜와 시간에 실행해야 하는 명령이 있는지 확인하고, 있다면 슈퍼유저, root 권한으로 실행한다.
3. 1분 동안 대기한다.
4. 1단계부터 반복한다.

이 버전의 크론은 기본적이고 견고했지만, 할 일이 있든 없든 리소스를 소비했다. 1970년대 후반 퍼듀 대학교에서 시간 공유 VAX에서 100명의 모든 사용자에게 크론 서비스를 확장하기 위한 실험에서, 이 방식은 시스템에 과도한 부하를 준다는 것이 밝혀졌다.

5.2. 다중 사용자 기능

유닉스 시스템 V 출시와 함께 크론은 슈퍼유저뿐만 아니라 유닉스 시스템의 모든 사용자가 사용할 수 있도록 확장되었다. 당시에는 100여 개의 사용자 계정을 가진 1 MIPS 시스템에서 새로운 접근 방식이 필요했다.

1977년 8월, Communications of the ACM에 W. R. 프란타와 커트 멜리가 발표한 "시뮬레이션 이벤트 집합을 위한 효율적인 데이터 구조" 기사는 "일반적으로 사용되는 단순 연결 목록 알고리즘보다 성능이 우수"한 이벤트 큐 데이터 구조를 설명했다.

퍼듀 대학교 대학원생 로버트 브라운은 이 기사를 통해 크론과 이산 이벤트 시뮬레이터의 유사성을 파악하고, 실험을 위해 프란타-멜리 이벤트 목록 관리자(ELM)를 구현했다.

이후, 키스 윌리엄슨을 포함한 새로운 대학원생들이 합류하여 브라운의 프로토타입 크론을 실제 서비스로 발전시켰다. 이 다중 사용자 크론은 1979년 말 퍼듀에서 사용되기 시작했으며, VAX 11/780에서 32/V를 실행하는 데 사용된 /etc/cron을 대체했다.

이 크론의 알고리즘은 다음과 같다.

1. 시작 시 모든 계정 소유자의 홈 디렉토리에서 .crontab 파일을 찾는다.
2. 발견된 각 crontab 파일에 대해 각 명령이 실행될 다음 시간을 결정한다.
3. 해당 명령들을 시간 및 "5개 필드" 시간 지정자와 함께 프란타-멜리 이벤트 목록에 배치한다.
4. 메인 루프:
* 큐 맨 앞의 작업을 검사하고 실행까지 남은 시간을 계산한다.
* 그 시간 동안 잠든다.
* 깨어나 정확한 시간을 확인 후, 큐 맨 앞 작업을 해당 사용자의 권한으로 (백그라운드에서) 실행한다.
* 이 명령의 다음 실행 시간을 결정하고 이벤트 목록에 다시 배치한다.

데몬은 SIGHUP 신호에 응답하여 수정된 crontab 파일을 다시 스캔하고, 시간 및 30분마다 특수 "깨우기 이벤트"를 예약하여 수정된 crontab 파일을 검색한다. 이 크론은 stdoutstderr 출력을 캡처하여 crontab 소유자에게 이메일로 보낸다.

이 크론은 작업량에만 비례하는 자원을 소비하며, 주기적인 변경 검사를 제외하고는 시간이 지나도 자원 소비가 크게 증가하지 않는다.

윌리엄슨은 학위 취득 후 AT&T 벨 연구소에 합류하여 이 크론을 가져갔다. 벨 연구소에서 그는 다른 사람들과 함께 유닉스 `at` 명령을 크론에 통합하고, crontab 파일을 사용자 홈 디렉토리에서 공통 스풀 디렉토리로 옮겼으며, 사용자가 crontab 명령을 통해 파일을 복사하도록 했다.

이 버전의 크론은 Unix System V와 BSD, 솔라리스(썬 마이크로시스템즈의), IRIX(실리콘 그래픽스의), HP-UX(휴렛 팩커드의), AIX(IBM의) 등에 거의 변경 없이 적용되었다.

5.3. 현대 버전

폴 빅시가 1987년에 처음 코딩한 Vixie cron이 널리 사용된다. Vixie cron의 버전 3은 1993년 말에 출시되었다. 2004년 1월, 버전 4.1은 ISC Cron으로 이름이 변경되어 출시되었다. 대부분의 리눅스와 BSD 배포판에서는 약간의 버그 수정이 포함된 버전 3을 사용한다.

2007년, 레드햇은 vixie-cron 4.1을 크로니 프로젝트로 포크했다. 2009년에는 아나크론 2.3이 크로니에 병합되었다. 아나크론은 독립적인 크론 프로그램이 아니며, 다른 크론 작업이 이를 호출해야 한다.

드래곤플라이 BSD의 dcron은 창립자인 맷 딜런이 만들었으며, 2010년 Jim Pryor가 유지 관리를 맡았다.

2003년, 데일 멜러는 Guile로 작성된 크론 변형인 mcron을 소개했다. mcron은 Vixie cron과의 상호 호환성을 제공하는 동시에, 일정 계산 및 작업 정의에 임의의 Scheme 코드를 사용할 수 있도록 하여 더 큰 유연성을 제공한다. mcron 데몬과 crontab 파일은 일반적으로 Scheme으로 작성되지만, 사용자 작업 큐의 누적 상태는 작업 코드에서 사용할 수 있으며, 다른 작업의 결과가 특정 기준을 충족하는 경우에 실행되도록 예약될 수 있다. Mcron은 Guix 패키지 관리자에서 기본적으로 배포되며, 패키지 관리자가 작업 실행에 필요한 패키지가 설치되었는지와 해당 crontab이 이를 올바르게 참조하는지 확인하면서 모나드적으로 mcron crontab을 생성할 수 있도록 하는 조항 (서비스)을 포함한다.

웹크론 솔루션은 크론 구현을 사용할 수 없는 웹 호스팅 서비스 환경에서 정기적으로 실행되도록 링 작업을 예약한다.