본문 바로가기
리눅스

cron

by 다움위키 2023. 12. 26.

소프트웨어 도구 크론은, 역시 크론 작업(cron job)이라고 알려져 있으며, 유닉스-계열 컴퓨터 운영 시스템에서 시간-기반 작업 스케줄러입니다. 소프트웨어 환경을 설정하고 유지 관리하는 사용자는 크론을 고정된 시간, 날짜 또는 간격으로 주기적으로 실행하기 위해 작업 (명령 또는 쉘 스크립트)을 시간표로 작성하기 위해 사용합니다. 그것은 전형적으로 시스템 유지 관리 또는 관리자-작업을 자동화합니다–하지만 일반적인-목적 본성은 인터넷에서 파일을 다운로드하는 것과 정기적으로 전자우편을 다운로드하는 것과 같은 작업을 유용하게 만듭니다.

크론은 반복 작업을 예약하기 위해 가장 적합합니다. 일회성 임무 예약은 결합된 at 유틸리티를 사용하여 달성될 수 있습니다.

Installation

대부분의 배포판에서 시스템 설치와 함께, 패키지가 설치됩니다.

어쨌든, 데비안 저장소에서 다음과 같이 설치할 수 있습니다:

  • sudo apt install cron

Overview

크론의 동작은 crontab (크론 테이블) 파일, 지정된 일정에 따라 주기적으로 실행할 명령을 지정하는 구성 파일에 의해 구동됩니다. 크론탭 파일은 작업의 목록과 크론 데몬에 대한 기타 지침이 보관되는 위치에 저장됩니다. 사용자는 자신의 개별적인 크론탭 파일을 가질 수 있고 종종 오직 시스템 관리자가 편집할 수 있는 시스템-전체 크론탭 파일 (보통 /etc 또는 /etc의 하위 디렉토리에 있음)이 있습니다.

크론탭 파일의 각 줄은 하나의 작업을 나타내고, 다음과 같은 것들입니다:

# ┌───────────── 분 (0 - 59)
# │ ┌───────────── 시간 (0 - 23)
# │ │ ┌───────────── 월의 날짜 (1 - 31)
# │ │ │ ┌───────────── 월 (1 - 12)
# │ │ │ │ ┌───────────── 주의 요일 (0 - 6) (일요일에서 토요일;
# │ │ │ │ │                                   7은 역시 일부 시스템에서 일요일입니다)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <실행할 명령>

각 줄의 구문은 명령을 실행할 시간을 나타내는 5개 필드로 구성된 크론 표현과 뒤따르는 실행할 쉘 명령을 나타냅니다.

전형적으로 작업은 시간/날짜 지정 필드가 모두 현재 시간과 날짜와 일치할 때 실행되지만 하나의 예외가 있습니다: 만약 "월의 날짜" (필드 3)과 "주의 요일" (필드 5) 둘 다가 제한되면 ("*" 아니면), 하나 또는 둘 다는 현재 날짜와 일치해야 합니다.

예를 들어, 다음은 크론 사용자에 대해 기본 쉘이 본 쉘 호환이라고 가정하여, 매일 자정을 지난 1분 (00:01)에 아파치 오류 로그를 지웁니다:

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

이 예제는 매주 토요일 23:45 (오후 11:45)에 export_dump.sh라고 불리우는 쉘 프로그램을 실행합니다.

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

주목: 역시 n-번째 간격마다 실행되도록 */n을 지정할 수도 있습니다. 역시, 여러 특정 시간 간격을 쉼표로 지정할 수 있습니다 (예를 들어, 1,2,3). 아래는 "hello world"를 매 5분마다 첫 번째, 두 번째 및 세 번째 시간 (즉, 01:00, 01:05, 01:10, 03:55가 될 때까지)에 명령줄에 출력합니다.

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

사용자에 대해 구성 파일은 실제 구현에서 이 파일을 저장하는 위치에 관계없이 crontab -e를 호출함으로써 편집될 수 있습니다.

Paul Vixie에 의해 쓰여진 인기 있는 4번째 BSD 판과 많은 리눅스 배포판에 포함된 것과 같은 일부 cron 구현은 여섯 번째 필드: 지정된 작업을 실행하는 계정 사용자 이름 (사용자 존재 및 권한에 따라 다름)을 포함합니다. 이것은 오직 시스템 크론탭에서 허용되며 다른 크론탭에서는 허용되지 않으며, 구성할 단일 사용자에게 각각 할당됩니다. 여섯 번째 필드는 대안적으로 때때로 계정 사용자이름 대신 year에 사용됩니다–윈도우에 대해 nncron 데몬이 이것을 수행합니다.

크론의 아마존 EventBridge 구현은 0 기반 요일을 사용하지 않고, 대신에 1-7 SUN-SAT (0-6 대신)입니다.

Nonstandard predefined scheduling definitions

일부 크론 구현은 다음과 같은 비표준 매크로를 지원합니다:

엔트리 설명 동등한 것
@yearly (or @annually) 일 년에 한 번 1월 1일 자정에 실행 0 0 1 1 *
@monthly 한 달에 한 번 매월 1일 자정에 실행 0 0 1 * *
@weekly 일 주일에 한 번 일요일 새벽 자정에 실행 0 0 * * 0
@daily (or @midnight) 하루에 한 번 자정에 실행 0 0 * * *
@hourly 한 시간에 한 번 시간의 시작에서 실행 0 * * * *
@reboot 컴퓨터 시작 시에 실행 N/A


@reboot은 데몬이 시작될 때 한 번 실행되도록 작업을 구성합니다. 크론은 전형적으로 다시 시작되지 않기 때문에, 이것은 전형적으로 부팅되는 시스템에 해당합니다. 이 행위는 데비안에서 제공되는 것과 같은 크론의 일부 변형에서 단순히 데몬을 다시 시작해도 @reboot 작업이 다시 실행되지 않도록 강제됩니다.

@reboot은 만약 특정 사용자로 서버나 데몬을 시작해야 하고 사용자가 프로그램을 시작하기 위해 init를 구성할 수 있는 접근 권한이 없는 경우에 유용할 수 있습니다.

Cron permissions

이들 두 파일은 다음과 같은 중요한 역할을 합니다:

  • /etc/cron.allow - 만약 이 파일이 존재하면, 그것은 해당 사용자에 대해 크론 작업을 사용할 수 있도록 해당 사용자의 이름을 포함해야 합니다.
  • /etc/cron.deny - 만약 cron.allow 파일이 존재하지 않지만 /etc/cron.deny 파일이 존재하면, 크론 작업을 사용하기 위해, 사용자는 /etc/cron.deny 파일에 나열되지 않아야 합니다.

이들 파일의 어떤 것도 존재하지 않으면, 사이트-종속 구성 매개변수에 따라, 오직 관리자가 크론 작업을 사용할 수 있거나 모든 사용자가 크론 작업을 사용할 수 있음을 주목하십시오.

Time zone handling

대부분의 크론 구현은 크론 데몬이 실행되는 시스템 시간대 설정에서 크론탭 엔트리를 단순히 해석합니다. 이것은 대규모 다중-사용자 시스템에 여러 시간대의 사용자가 있으면, 특히 시스템 기본 시간대에 잠재적으로 혼동을 줄 수 있는 DST가 포함되면 분쟁의 원인이 될 수 있습니다. 따라서 크론 구현은 특수한 경우로 사용자 크론탭에서 "CRON_TZ=<time zone>" 형식의 줄을 인식하여 해당 시간대와 관련된 후속 크론탭 엔트리를 해석할 수 있습니다.

Log

대체로 /var/log/syslog에 크론 로그가 쌓입니다. 이것을 별도의 다른 파일에 기록하고 싶으면, 다음 파일을 수정해야 합니다:

  • sudo vi /etc/rsyslog.conf

위 파일에서 #cron으로 주석처리되어 있는 줄에서 #을 제거합니다.

  • sudo systemctl restart rsyslog

CRON expression

CRON 표현은 통상적으로 일부 루틴을 실행하기 위한 시간표로 시간의 집합을 나타내는 공백에 의해 구분된 5개 또는 6개의 필드로 구성하는 문자열입니다.

주석은 주석 표식 #로 시작하고, 한 줄에 자체로 있어야 합니다.

필드 요구됨 허용된 값 허용된 특수 문자 비고
Yes 0–59 * , -  
Yes 0–23 * , -  
월의 날짜 Yes 1–31 * , - ? L W 오직 일부 구현에서 ? L W
Yes 1–12 또는 JAN–DEC * , -  
주의 요일 Yes 0–6 또는 SUN–SAT * , - ? L # 오직 일부 구현에서 ? L #
No 1970–2099 * , - 이 필드는 표준/기본 구현에서 지원되지 않습니다.

월과 주의 요일 약어는 대소문자를 구분하지 않습니다.

시스템 크론탭 파일 (/etc/crontab)의 특정 경우에서, user 필드가 command 앞에 자체로 삽입됩니다. 그것은 일반적으로 'root'로 설정됩니다.

CRON 형식의 일부 사용에서 패턴 시작 부분에 seconds 필드가 역시 있습니다. 이 경우에서, CRON 표현은 6개 또는 7개의 필드로 구성하는 문자열입니다.

Comma ( , )

쉼표는 목록의 항목을 구분하기 위해 사용됩니다. 예를 들어, 5번째 필드 (주의 요일)에 "MON,WED,FRI"를 사용하면 월요일, 수요일, 및 금요일을 의미합니다.

Dash ( - )

대시는 범위를 정의합니다. 예를 들어, 2000–2010은 2000년과 2010년 사이와 자체를 포함하는 매년을 나타냅니다.

Percent ( % )

명령에서 백분율 기호 (%)는 백슬래시 (\)로 탈출되지 않는 한 새로운-줄 문자로 변경되고, 첫 번째 % 이후의 모든 데이터는 표준 입력으로 명령에 전해집니다.

Non-standard characters

다음은 비표준 문자이고 Quartz 자바 스케줄러와 같은 일부 크론 구현에만 존재합니다.

L

'L'은 "마지막"을 의미합니다. 주의-요일 필드에 사용될 때, 주어진 월의 "마지막 금요일" ("5L")과 같은 구문을 지정하는 것을 허용합니다. 월의-날짜 필드에서, 그 월의 마지막 날을 지정합니다.

W

'W' 문자는 월의-날짜 필드에 대해 허용됩니다. 이 문자는 주어진 날짜에 가장 가까운 주의-요일 (월요일-금요일)을 지정하기 위해 사용됩니다. 예제로써, 만약 "15W"는 월의-날짜 필드에 대해 값으로 지정되면, 의미는 "매월 15일에 가장 가까운 주의-요일"입니다. 따라서, 만약 15일이 토요일이면, 14일 금요일에 트리거가 실행됩니다. 15일이 일요일이면 16일 월요일에 트리거가 실행됩니다. 15일이 화요일이면 15일 화요일에 실행됩니다. 어쨌든, "1W"가 월의-날짜의 값으로 지정되고 1일이 토요일이면, 트리거는 월의 날짜의 경계를 '점프'하지 않기 때문에 3일 월요일에 실행됩니다. 'W' 문자는 월의-날짜가 날짜의 범위나 목록이 아닌 오직 하루일 때 지정될 수 있습니다.

Hash (#)

'#'는 주의-요일 필드에 허용되고, 그 뒤에 1에서 5 사이의 숫자가 와야 합니다. 그것은 주어진 월의 "두 번째 금요일"과 같은 구문을 지정하는 것을 허용합니다. 예를 들어 주의-요일 필드에 "5#3"을 입력하면 매월 세 번째 금요일에 해당합니다.

Question mark (?)

일부 구현에서, '*' 대신 월의-날짜 또는 주의-요일을 공백으로 남겨두는 데 사용됩니다. 다른 크론 구현은 "?"를, 만약 크론이 오전 8:25에서 시작되었고, 다시 재시작할 때까지 매일 이 시간에 실행되어야 하면 ? ? * * * *가 25 8 * * * *로 업데이트되도록, 크론 데몬의 시작 시간을 대체합니다.

Slash (/)

vixie-cron에서, 슬래시는 단계 값을 지정하기 위해 범위와 결합될 수 있습니다. 예를 들어, 분 필드에서 */5는 5분마다를 나타냅니다 (빈도에 대한 아래 주목할 점을 참조하십시오). 그것은 더 자세한 POSIX 형식 5,10,15,20,25,30,35,40,45,50,55,00에 대해 줄임말입니다. POSIX는 슬래시 사용을 정의하지 않습니다; 그 근거 (BSD 확장에 대해 언급)는 정의가 System V 형식을 기반으로 하지만 확장의 가능성을 배제하지 않는다는 점에 주목합니다.

 

빈도는 일반적으로 표현될 수 없음을 주목하십시오; 범위를 균등하게 나누는 단계 값만이 정확한 빈도를 나타냅니다 (분과 초에 대해, 그것은 /2, /3, /4, /5, /6, /10, /12, /15, /20/30인데 왜냐하면 60은 해당 숫자로 균등하게 나눌 수 있기 때문입니다; 시간에 대해, 그것은 /2, /3, /4, /6, /8 and /12입니다); 모든 다른 가능한 "단계" 및 모든 다른 필드는 다음 분, 초 또는 날짜로 "재설정"되기 전에 시간 단위의 끝에서 일관되지 않은 "짧은" 기간을 생성합니다; 예를 들어, 날짜 필드에 */5를 입력하면 때때로 월과 윤년에 따라 1, 2 또는 3일 후에 실행합니다; 이것은 크론이 상태무관이기 때문입니다 (그것은 마지막 실행 시간을 기억하지 않고 정확한 빈도 계산에 필요한 그것과 현재의 차이를 계산하지도 않습니다–대신, 크론은 단순한 패턴-일치기입니다).

H 'H'는 Jenkins 연속 통합 시스템에서 "해시된" 값이 대체됨을 나타내기 위해 사용됩니다. 따라서 매시 정각 20분 후를 의미하는 '20 * * * *'와 같은 고정된 숫자 대신에, 'H * * * *'는 임무가 각 임무에 대해 지정되지 않지만 불변의 시간에 매시간 수행됨을 나타냅니다. 이것은 모든 임무를 동시에 시작하고 리소스를 놓고 경쟁하는 대신에 시간이 지남에 따라 임무를 분산하는 것을 허용합니다.

External links