리눅스 crontab(크론탭) 모든 것! - 지식유니버스

2024년 8월 1일 목요일

리눅스 crontab(크론탭) 모든 것!

 명령 cron줄 유틸리티는 Unix 계열 운영 체제 의 작업 스케줄러 입니다 . 소프트웨어 환경을 설정하고 유지 관리하는 사용자는 cron을 사용하여 작업  (명령 또는 셸 스크립트 )을 예약합니다. 이를 cron 작업 이라고도 하며 [3] 고정된 시간, 날짜 또는 간격으로 주기적으로 실행합니다.  일반적으로 시스템 유지 관리 또는 관리를 자동화하지만 일반적인 용도의 특성으로 인해 인터넷 에서 파일을 다운로드하거나 정기적으로 이메일을 다운로드하는 것과 같은 작업에 유용합니다. [5]

Cron은 반복적인 작업을 스케줄링하는 데 가장 적합합니다. 일회성 작업은 연관된 at 유틸리티를 사용하여 스케줄링할 수 있습니다.

Cron이라는 이름은 시간을 의미하는 그리스어 Chronos 에서 유래되었습니다. [6] [ 더 나은 소스가 필요합니다 ]

개요

편집하다 ]

cron의 동작은 crontab (cron 테이블) 파일에 의해 구동됩니다. 이 파일은 주어진 일정에 따라 주기적으로 실행될 셸 명령을 지정하는 구성 파일입니다. crontab 파일은 cron 데몬 에 대한 작업 목록과 기타 지침이 보관되는 곳에 저장됩니다. 사용자는 각자의 개별 crontab 파일을 가질 수 있으며 종종 시스템 관리자만 편집할 수 있는 시스템 전체 crontab 파일(보통 eg /etc의 하위 디렉토리 에 있음)이 있습니다 [참고 1]/etc/etc/cron.d

crontab 파일의 각 줄은 작업을 나타내며 다음과 같습니다.

# ┌────────────── 분 (0–59) 
# │ ┌───────────── 시 (0–23) 
# │ │ ┌──────────── 일 (1–31) 
# │ │ │ ┌──────────── 월 (1–12) 
# │ │ │ │ ┌──────────── 요일 (0–6) (일요일~토요일; 
# │ │ │ │ │ │ 일부 시스템에서는 7이 일요일이기도 함) 
# │ │ │ │ 
# │ │ │ │ │ 
# * * * * * <실행할 명령>

각 줄의 구문은 명령을 실행하는 데 걸리는 시간을 나타내는 5개 필드로 구성된 cron 표현식과 실행할 셸 명령을 기대합니다.

일반적으로 작업은 시간/날짜 지정 필드가 모두 현재 시간 및 날짜와 일치할 때 실행되지만 하나의 예외가 있습니다. "일자"(필드 3)와 "요일"(필드 5)이 모두 제한되어 있는 경우(필드 3과 필드 5가 "*"를 포함하지 않는 경우) 하나 또는 둘 다 현재 날짜와 일치해야 합니다. [7]

예를 들어, 다음은 cron 사용자의 기본 셸이 Bourne 셸과 호환된다고 가정하고 매일 자정(00:01) 1분 후에 Apache 오류 로그를 지웁니다.

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시간마다(예: 01:00, 01:05, 01:10, 03:55까지) 명령줄에 "hello world"를 출력합니다.1,2,3

*/5 1 ,2,3 * * * 에코 안녕하세요 세계
       

사용자의 구성 파일은 crontab -e실제 구현에서 이 파일을 저장하는 위치에 관계없이 호출하여 편집할 수 있습니다.

Paul Vixie 가 작성 하고 많은 Linux 배포판에 포함된 인기 있는 4th BSD editioncron 과 같은 일부 구현은 여섯 번째 필드를 추가합니다. 지정된 작업을 실행하는 계정 사용자 이름(사용자 존재 및 권한에 따라 다름). 이는 시스템 crontab에서만 허용되며, 각각 단일 사용자에게 할당되어 구성되는 다른 crontab에서는 허용되지 않습니다. 여섯 번째 필드는 때때로 계정 사용자 이름 대신 연도 에 사용되기도 합니다 . Windows용 nncron 데몬이 이를 수행합니다.

Amazon EventBridge의 cron 구현은 0 기반 요일을 사용하지 않고 대신 1-7 SUN-SAT(0-6 대신)를 사용하며 첫 번째 주중 요일 및 마지막 요일과 같은 추가 표현 기능도 지원합니다. [8]

비표준 사전 정의된 스케줄링 정의

편집하다 ]

일부 cron 구현 [9]은 다음과 같은 비표준 매크로를 지원합니다.

기입설명와 동등하다
@yearly(또는 @annually)1년에 한 번 1월 1일 자정에 실행0 0 1 1 *
@monthly매월 1일 자정에 한 번씩 실행합니다.0 0 1 * *
@weekly매주 일요일 자정에 한 번씩 실행0 0 * * 0
@daily(또는 @midnight)하루에 한 번 자정에 실행0 0 * * *
@hourly매 시간마다 한 번씩 정각에 실행0 * * * *
@reboot시작시 실행

@reboot데몬이 시작될 때 한 번 실행되도록 작업을 구성합니다. cron은 일반적으로 다시 시작되지 않으므로 이는 일반적으로 부팅되는 머신에 해당합니다. 이 동작은 Debian에서 제공되는 것과 같은 일부 cron 변형에서 적용되므로 10 ] 데몬을 다시 시작해도 작업이 다시 실행되지 않습니다 @reboot.

@reboot특정 사용자로 서버나 데몬을 시작해야 하지만, 사용자가 프로그램을 시작하기 위해 init을 구성할 수 있는 액세스 권한이 없는 경우 유용할 수 있습니다.

Cron 권한

편집하다 ]

다음 두 파일은 중요한 역할을 합니다.

  • /etc/cron.allow – 이 파일이 있으면 해당 사용자가 cron 작업을 사용할 수 있도록 해당 파일에 사용자 이름이 포함되어 있어야 합니다.
  • /etc/cron.deny – cron.allow 파일이 없지만 /etc/cron.deny 파일이 있는 경우, cron 작업을 사용하려면 사용자가 /etc/cron.deny 파일에 나열되어 있지 않아야 합니다.

이 두 파일이 모두 존재하지 않을 경우, 사이트별 구성 매개변수에 따라 슈퍼 유저만 cron 작업을 사용할 수 있거나 모든 사용자가 cron 작업을 사용할 수 있습니다.

시간대 처리

편집하다 ]

대부분의 cron 구현은 cron 데몬이 실행되는 시스템 시간대 설정에서 crontab 항목을 간단히 해석합니다. 이는 대규모 다중 사용자 머신에 여러 시간대의 사용자가 있는 경우, 특히 시스템 기본 시간대에 잠재적으로 혼란스러운 DST가 포함된 경우 분쟁의 원인이  수 있습니다. 따라서 cron 구현은 특별한 경우 사용자 crontab에서 "CRON_TZ=<시간대>" 형태의 줄을 인식하여 해당 시간대를 기준으로 후속 crontab 항목을 해석할 수 있습니다. [11]

역사

편집하다 ]

초기 버전

편집하다 ]

버전 7 Unix 의 cron은 운영 체제가 다중 사용자 모드에 들어갔을 때 호출되는 시스템 서비스(나중에 데몬 이라고 함 ) 였습니다. [12] 알고리즘 은 간단했습니다. /etc/rc

  1. [13]을 읽어보세요/usr/lib/crontab
  2. 명령이 현재 날짜와 시간에 실행되어야 하는지 확인하고, 그렇다면 슈퍼유저인 root로 실행하세요.
  3. 1분만 자세요
  4. 1단계부터 반복합니다.

이 버전의 cron은 기본적이고 견고했지만, 할 일을 찾든 찾지 않든 리소스를 소모했습니다. 1970년대 후반 퍼듀 대학 에서 시분할 VAX 에서 cron 서비스를 모든 100명의 사용자에게 확장하기 위한 실험에서 시스템에 너무 많은 부하를 주는 것으로 나타났습니다.

다중 사용자 기능

편집하다 ]

Unix System V 가 출시되면서 cron의 다음 버전은 cron의 기능을 슈퍼유저뿐만 아니라 Unix 시스템의 모든 사용자에게 확장하기 위해 만들어졌습니다. 오늘날 대부분의 Unix 및 Unix 유사 시스템이 강력한 프로세서와 소수의 사용자를 가지고 있기 때문에 이는 사소한 일로 보일 수 있지만 당시에는 약 100개의 사용자 계정이 있는 1MIPS 시스템에서 새로운 접근 방식이 필요 했습니다 .

1977년 8월 ACM 커뮤니케이션 에서 WR Franta와 Kurt Maly는 "시뮬레이션 이벤트 집합을 위한 효율적인 데이터 구조"라는 제목의 기사를 발표했습니다. 이 기사에서는 "일반적으로 사용되는 단순 연결 목록 알고리즘보다 뛰어난 성능", 비균일 시간 분포를 감안한 양호한 동작, 최악의 경우 복잡성을 입증한 이산 이벤트 구동 시뮬레이션 시스템을 위한 이벤트 큐 데이터 구조를 설명합니다. , "n"은 대기열에 있는 이벤트의 수입니다.

퍼듀 대학원생인 로버트 브라운은 이 기사를 검토하면서 크론과 이산 이벤트 시뮬레이터 간의 유사점을 인식하고 실험을 위해 Franta-Maly 이벤트 목록 관리자(ELM)를 구현했습니다. 이산 이벤트 시뮬레이터는 가상 시간 으로 실행되어 가능한 한 빨리 이벤트 큐에서 이벤트를 제거하고 "지금"이라는 개념을 다음 이벤트의 예약된 시간으로 진행합니다. 가상 시간 대신 "실시간"으로 이벤트 시뮬레이터를 실행하면 대부분의 시간을 잠자고 이벤트 목록의 맨 위에 있는 작업을 실행하기 위해 예약된 시간을 기다리는 크론 버전이 생성되었습니다.

다음 학년에는 퍼듀 대학의 대학원 프로그램에 신입생이 들어왔는데, 여기에는 컴퓨터 과학부의 시스템 직원에 합류한 Keith Williamson도 포함되었습니다. Brown은 "워밍업 과제"로 그에게 프로토타입 cron을 프로덕션 서비스로 구체화하도록 요청했고, 이 다중 사용자 cron은 1979년 후반에 퍼듀에서 사용되었습니다. 이 버전의 cron은 /etc/cron32/V를 실행하는 컴퓨터 과학부의 VAX 11/780에서 사용 중이던 cron을 완전히 대체했습니다.

이 cron에서 사용하는 알고리즘은 다음과 같습니다.

  1. 시작할 때, .crontab모든 계정 소유자의 홈 디렉토리에 있는 파일을 찾으세요.
  2. 발견된 각 crontab 파일에 대해 각 명령을 다음에 실행해야 할 시간을 결정합니다.
  3. 해당 명령을 해당 시간과 "5개 필드" 시간 지정자와 함께 Franta-Maly 이벤트 목록에 배치합니다.
  4. 메인 루프를 입력하세요:
    1. 대기열의 머리에 있는 작업 항목을 살펴보고, 얼마나 미래에 실행되어야 하는지 계산합니다.
    2. 그 시간 동안 잠을 자세요.
    3. 깨어나서 정확한 시간을 확인한 후, 작업을 만든 사용자의 권한으로 대기열의 맨 앞(백그라운드)에 있는 작업을 실행합니다.
    4. 이 명령을 실행할 다음 시간을 결정하고 해당 시간 값에서 이벤트 목록에 다시 추가합니다.

또한 데몬은 SIGHUP 신호에 응답하여 수정된 crontab 파일을 다시 검사하고 수정된 crontab 파일을 찾기 위해 매 시간 및 30분마다 특별한 "깨어남 이벤트"를 예약합니다. 컴퓨터 시간 추적, Unix 알람 스케줄링, 명시적 시간 변경 및 프로세스 관리의 부정확성에 대한 자세한 내용은 여기에서 생략되며, 이 모든 것이 이 cron의 코드 줄 대부분을 차지합니다. 이 cron은 또한 stdout 및 stderr 의 출력을 캡처하여 모든 출력을 crontab 소유자에게 이메일로 보냈습니다.

이 cron이 소비하는 리소스는 주어진 작업량에 따라서만 조절되며, 주기적으로 변경 사항을 확인하는 경우를 제외하면 시간이 지나도 본질적으로 증가하지 않습니다.

윌리엄슨은 학업을 마치고 컴퓨터 과학 석사 학위를 받고 대학을 떠나 뉴저지 주 머레이힐에 있는 AT&T 벨 연구소에 입사하여 이 크론을 가져갔습니다. 벨 연구소에서 그와 다른 사람들은 유닉스 명령 at 크론에 통합하고, 사용자의 홈 디렉토리(호스트에 국한되지 않음)에서 크론탭 파일을 꺼내 공통 호스트에 국한된 스풀 디렉토리로 옮겼으며, crontab사용자가 크론탭을 해당 스풀 디렉토리에 복사할 수 있도록 명령을 추가했습니다.

이 버전의 cron은 나중에 Unix System V 와 BSD 및 그 파생물인 Sun Microsystems 의 Solaris , Silicon Graphics 의 IRIX , Hewlett-Packard 의 HP-UX , IBM 의 AIX 에서 크게 변경되지 않은 채로 나타났습니다. 기술적으로 이러한 구현에 대한 원래 라이선스는 작업을 자금 지원한 Purdue Research Foundation에 있어야 하지만, 이는 이러한 문제에 대한 관심이 거의 없었던 시기에 이루어졌습니다.

현대 버전

편집하다 ]

GNU 프로젝트 와 Linux 의 등장과 함께 새로운 크론이 등장했습니다. 이 중 가장 널리 퍼진 것은 Vixie 크론으로, 원래는 1987년 Paul Vixie 가 코딩했습니다. Vixie 크론 의 버전 3은 1993년 후반에 출시되었습니다. 버전 4.1은 ISC Cron 으로 이름이 변경되어 2004년 1월에 출시되었습니다. 버전 3은 약간의 버그 수정을 거쳐 대부분의 Linux 및 BSD 배포판에서 사용됩니다.

2007년에 Red Hat은 vixie-cron 4.1을 cronie 프로젝트로 포크하고 2009년에 anacron 2.3을 포함했습니다. 인용 필요 ] 그러나 Anacron은 독립적인 cron 프로그램이 아닙니다. 다른 cron 작업에서 호출해야 합니다.

DragonFly 의 dcron은 창립자인 Matt Dillon이 만들었고 , 유지 관리 업무는 2010년에 Jim Pryor가 맡았습니다. [14]

2003년에 Dale Mellor는 Guile 로 작성된 cron 변형인 mcron [15] 을 소개했는데 , 이는 Vixie cron과의 교차 호환성을 제공하는 동시에 임의의 scheme 코드를 스케줄링 계산 및 작업 정의에 사용할 수 있으므로 더 큰 유연성을 제공합니다. mcron 데몬과 crontab 파일은 모두 일반적으로 scheme으로 작성되므로(mcron은 기존 Vixie crontab도 허용하지만) 사용자의 작업 대기열의 누적 상태를 작업 코드에서 사용할 수 있으며, 다른 작업의 결과가 특정 기준을 충족하는 경우 실행되도록 예약할 수 있습니다. mcron은 기본적으로 Guix 패키지 관리자 아래에 배포되며 여기 에는 패키지 관리자가 mcron crontab을 모나드 방식으로 내보내는 조항( 서비스 )이 포함되어 있으며, 작업 실행에 필요한 패키지가 설치되고 해당 crontab이 이를 올바르게 참조하도록 합니다. [16]

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

Cron 표현

편집하다 ]

Cron 표현식은 공백 [17] 으로 구분된 5~6개 필드로 구성된 문자열로 , 일반적으로 일부 루틴을 실행하기 위한 일정과 같은 시간 집합을 나타냅니다.

주석은 주석 표시 #으로 시작하며, 한 줄에 단독으로 작성되어야 합니다.

필드필수의허용된 값허용되는 특수 문자비고
0–59* , -
시간0–23* , -
일자1–31* , - ? L W? L W일부 구현에서만 가능
1–12 또는 1월–12월* , -
요일0–6 또는 일–토* , - ? L #? L #일부 구현에서만 가능
년도아니요1970년~2099년* , -이 필드는 표준/기본 구현에서는 지원되지 않습니다.

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

시스템 crontab 파일(/etc/crontab)의 특별한 경우, 사용자 필드는 명령 앞에 삽입됩니다 . 일반적으로 'root'로 설정됩니다.

일부 cron 형식 사용에는 패턴 시작 부분에 초 필드 도 있습니다 . 이 경우 cron 표현식은 6개 또는 7개 필드로 구성된 문자열입니다. [18]

별표( *)
별표(와일드카드라고도 함)는 "모두"를 나타냅니다. 예를 들어, "* * * * *"를 사용하면 1분마다 실행됩니다. "* * * * 1"을 사용하면 월요일에만 1분마다 실행됩니다. 별표 6개를 사용하면 초가 지원되는 경우 1초마다 실행됩니다.
반점 ( ,)
쉼표는 목록의 항목을 구분하는 데 사용됩니다. 예를 들어, 5번째 필드(요일)에 "MON,WED,FRI"를 사용하면 월요일, 수요일, 금요일을 의미합니다.
하이픈 ( -)
하이픈은 범위를 정의합니다. 예를 들어, "2000-2010"은 2000년과 2010년 사이의 모든 해를 나타냅니다.
퍼센트( %)
백슬래시(\)로 이스케이프하지 않는 한 명령의 퍼센트 기호(%)는 줄 바꿈 문자로 변경되고 첫 번째 % 이후의 모든 데이터는 표준 입력으로 명령에 전송됩니다. [19]

비표준 문자

편집하다 ]

다음은 비표준 문자이며 Quartz Java 스케줄러 와 같은 일부 cron 구현에만 존재합니다 .

L
'L'은 "마지막"을 의미합니다. 요일 필드에서 사용하면 주어진 달의 "마지막 금요일"(" 5L ")과 같은 구문을 지정할 수 있습니다. 일 필드에서 해당 달의 마지막 날을 지정합니다.
W
'W' 문자는 일자 필드에 허용됩니다. 이 문자는 주어진 요일에 가장 가까운 요일(월요일~금요일)을 지정하는 데 사용됩니다. 예를 들어, 일자 필드의 값으로 " 15W "를 지정한 경우 "해당 월의 15일에 가장 가까운 요일"을 의미합니다. 따라서 15일이 토요일이면 트리거는 14일 금요일에 실행됩니다. 15일이 일요일이면 트리거는 16일 월요일에 실행됩니다. 15일이 화요일이면 트리거는 15일 화요일에 실행됩니다. 그러나 일자 필드에 "1W"를 지정하고 1일이 토요일이면 트리거는 3일 월요일에 실행됩니다. 한 달의 일 경계를 '건너뛰지' 않기 때문입니다. 'W' 문자는 일자가 범위나 일 목록이 아닌 단일 일인 경우에만 지정할 수 있습니다.
해시( #)
'#'은 요일 필드에 허용되며 1~5 사이의 숫자가 뒤에 와야 합니다. 이를 통해 주어진 월의 "두 번째 금요일"과 같은 구문을 지정할 수 있습니다. [20] 예를 들어, 요일 필드에 "5#3"을 입력하면 매월 세 번째 금요일에 해당합니다.
물음표 ( ?)
일부 구현에서는 ' * ' 대신 일자 또는 요일을 비워두는 데 사용됩니다. 다른 cron 구현에서는 "?"를 cron 데몬의 시작 시간으로 대체하여 cron이 오전 8시 25분에 시작되면 업데이트되고 다시 시작할 때까지 매일 이 시간에 실행됩니다. [21]? ? * * * *25 8 * * * *
슬래시( /)
vixie-cron에서 슬래시를 범위와 결합하여 단계 값을 지정할 수 있습니다. [9] 예를 들어, 분 필드의 */5는 5분마다를 나타냅니다(빈도에 대한 아래 참고 사항 참조). 이는 더 자세한 POSIX 형식인 5,10,15,20,25,30,35,40,45,50,55,00 의 약어입니다 . POSIX는 슬래시 사용을 정의하지 않습니다. 그 근거(BSD 확장에 대한 논평)는 정의가 System V 형식을 기반으로 하지만 확장 가능성을 배제하지 않는다고 언급합니다. [7]

일반적으로 주파수는 표현할 수 없습니다. 범위를 균등하게 나누는 단계 값만이 정확한 주파수를 표현합니다(분과 초의 경우 /2, /3, /4, /5, /6, /10, /12, /15, /20 및 /30 입니다. 60은 이 숫자로 균등하게 나누어 떨어지기 때문입니다. 시간의 경우 /2, /3, /4, /6, /8 및 /12 입니다). 다른 모든 가능한 "단계"와 다른 모든 필드는 다음 분, 초 또는 일로 "재설정"되기 전에 시간 단위의 끝에서 일관되지 않은 "짧은" 기간을 생성합니다. 예를 들어, 일 필드에 */5를 입력하면 월과 윤년에 따라 1일, 2일 또는 3일 후에 실행되는 경우가 있습니다. 이는 cron이 상태를 저장하지 않기 때문입니다(마지막 실행 시간을 기억하지 않고 정확한 주파수 계산에 필요한 현재와의 차이를 계산하지 않습니다. 대신 cron은 단순한 패턴 매처입니다).

crontab 스케줄링 기능을 제공하는 일부 언어별 라이브러리는 범위가 사용될 때 슬래시 왼쪽에 "엄격한" 범위 15-59/XX를 요구하지 않습니다. [22] 이러한 경우 15/XX는 분 섹션의 15-59/10 의 vixie-cron 스케줄과 동일합니다 . 마찬가지로 0-23/XX 에서 시간, 일 및 월에 대한 추가 -23 , 1-31/XX 에서 -31 및 1-12/XX 에서 -12를 각각 제거할 수 있습니다 .

댓글 없음:

댓글 쓰기