별표가 없는 달과 요일에 대해 POSIX crontab이 잘못되었나요?

별표가 없는 달과 요일에 대해 POSIX crontab이 잘못되었나요?

배경

UNIX cron은 다음과 같은 상황에서 작업을 실행하는 것으로 알려져 있습니다.누구나달의 일또는별표 와일드카드 대신 명시적인 값을 사용하여 둘 다 지정한 경우 요일이 일치합니다.

0 0 * * 1     # every Monday
0 0 1 * *     # every month's first day
0 0 1 * 1     # every Monday *and also* every month's first day
0 0 1 * 1-7   # every day
0 0 1-31 * 1  # every day

이러한 일반적인 예에는 모두 *월 필드가 포함되어 있습니다.

별표가 없는 달에 대한 POSIX

POSIX 사양은 실제로 다음과 같이 말합니다.crontab(강조):

날짜는 날짜와 요일의 두 필드를 사용하여 지정할 수 있습니다. 월, 일, 요일에 모두 <별표> 문자가 포함되어 있으면 매일 일치됩니다. 월 또는 월 일이 요소 또는 목록으로 지정되었지만 요일이 <별표>인 경우 월 및 월 일 필드는 일치하는 날짜를 지정해야 합니다. 만약에월 및월의 날짜가 <별표>로 지정되었지만 요일이 요소 또는 목록인 경우 지정된 요일만 일치합니다. 마지막으로 만약에월 또는해당 월의 특정 날짜를 요소 또는 목록으로 지정하고, 요일도 요소 또는 목록으로 지정하여 임의의 날짜를 일치시킵니다.월과 일, 또는 요일,일치해야합니다.

다음 일정이 일치한다고 명시되어 있는 것 같습니다.누구나또는요일:

0 0 * 1 1     # every month's every Monday *and also* every day in January
0 0 * 1-12 1  # every day
0 0 1 1 1     # every month's every Monday *and also* 1 January

실제로 별표가 없는 달

내가 아는 한, 일반적인 현대적 또는 역사적 크론 구현은 실제로 이 작업을 수행하지 않습니다.SVR4 예약된 작업(이것은 반드시첫 번째해당 월의 날짜와 일치또는요일) 및 그 하위 항목오픈 솔라리스그리고일루모스또한빅시 크라운그리고 그 후손들친구그리고FreeBSD,오픈BSD,네트워크BSD,잠자리BSD그리고애플 시스템크론과바쁜Boxcrond.

대신 이러한 모든 구현에서는 필드의 형식에 관계없이 항상 월 필드에 대한 일치가 필요하며 두 개의 월-일 및 요일 필드가 날짜 포함 *또는 명시적 값을 변경하는지 여부에 따라 논리만 일치합니다. 기울기:

0 0 * 1 1     # every Monday in January
0 0 * 1-12 1  # every Monday
0 0 1 1 1     # every Monday in January *and also* 1 January

(또는 BusyBox의 경우 사용된 구문에 관계없이 필드에 값의 전체 범위가 포함되어 있는지 또는 엄격한 하위 집합이 포함되어 있는지 여부에 따라 다름)

사양이 잘못되었나요?

POSIX 사양에 설명된 동작이 실제로 어디에서나 구현됩니까? 결함 보고서를 제출하면 해당 설명이 수정 가능한 사양 오류인가요? 왜 이런 식으로 표현되었는지 뒷이야기가 있나요?

답변1

디지털 유닉스v4(일명.OSF1)이 이를 구현했습니다(아카이브매뉴얼 페이지는 여기에 있습니다):

명령이 실행될 날짜를 날짜와 요일의 두 필드에서 지정할 수 있습니다. 두 필드를 모두 지정하거나 하나만 지정할 수 있습니다. 한 필드만 사용하여 날짜를 지정하려면 다른 필드에 별표(*)를 포함해야 합니다. 두 방법을 모두 사용하는 경우 둘 중 하나의 사양이 충족되는 한 명령이 실행됩니다.

이것도 이렇다솔라리스그래도 맞다매뉴얼 페이지의 텍스트명확성이 부족하고 항상 그렇습니다. 예제 3은 예상되는 동작을 명확하게 보여줍니다.

예시 3 월과 요일 지정

이 예에서는 매월 1일과 15일, 그리고 매주 월요일에 명령을 실행합니다.

0 0 1,15 * 1

딜런crond"매월 두 번째 월요일"로 해석되며 * * 2 * mon유용하지만 비표준이기도 합니다. 정답은질문이 연결됨저자 @thanasisp는 이 점에 대해 유용한 자료를 제공합니다. "또는" 행동은 다음에서 비롯됩니다.시스템 VR2(c. 1985) 적어도.

Open Group 문서를 읽을 때 다음 사항에 유의하는 것이 중요하다는 것을 알았습니다.

  • RFC와 마찬가지로 특정 문맥에서 특정 단어의 현학적 의미
  • ⌦ ... ⌫ 기호로 묶인 텍스트 섹션(이러한 기호는 앞뒤 모두 삭제될 수 있으므로 이는 특이한 규칙입니다.)

crontab 참조의 텍스트는 일부 [UP] ⌦ ... ⌫선택적 동작(에 대한)을 나타내기 위해 표시됩니다.crontab -e사용자 테이블 유틸리티의 "입력 파일" 섹션에는 그러한 태그가 없습니다.

마지막으로, 월이나 일자가 요소나 목록으로 지정되고, 요일도 요소나 목록으로 지정되면 해당 월과 해당 월의 일자 또는 일자가 일치하는 모든 날이 해당됩니다. 주,할 것이다성냥.

"해야 한다"는 말을 강조했는데,의심의 여지가 없다:

할 것이다

POSIX.1-2017 호환 구현의 경우 필수 기능 또는 동작을 설명합니다. 애플리케이션은 기능이나 동작의 존재에 의존할 수 있습니다.

애플리케이션이나 사용자에 대해 시행되는 동작을 설명합니다.

그러나 시스템 관리자로서 저는 틀릴 수 없는 정식 추상화를 생각하는 경향이 있습니다(너무 틀려서 구현할 수 없는 경우는 제외). 버그가 있는 경우 명시된 사양을 준수하지 않으면 구현에 있는 것입니다( POSIXLY_CORRECT이는 온건함이나 사용자 기대를 위해 사양을 변경하는 구현자의 일반적인 감옥 탈출 조치일 수 있음).

관련 정보