간격 cron은 언제 처음 실행됩니까? (예: */3일)

간격 cron은 언제 처음 실행됩니까? (예: */3일)

너무 길어요.: cron은 실행 시간을 결정하기 위해 간격 값을 사용하여 현재 날짜의 값과 비교합니까, 아니면 문자 그대로 "3일마다" 생성 후 지정된 시간에 실행됩니까?

질문:

다음 작업을 추가하면 crontab -e내일 자정에 처음으로 실행되나요, 아니면 내일부터 3일 동안 실행되나요? 아니면 매월 "셋째" 날에만 해당됩니까? 1일차, 4일차, 7일차, 10일차...?

0 0 */3 * * /home/user/script.sh

어제 이 크론을 넣었고 오늘 아침에 실행되었지만(이것이 내 질문에 대한 답일 수 있음) 이것이 올바른지 확인하고 싶습니다. 오늘이 31일인데 간격 값이 시퀀스에 속하는 것 같습니다. cron이 이번 달 1일에 간격 실행을 시작하면 내일 다시 실행되나요?

추가 참고 사항:

가지다cron에 관한 훌륭한 게시물과 리소스가 이미 있습니다.일반적으로 말하면(이것은 내가 아는 일반적인 주제입니다) 특정 간격의 시작점이 나에게는 그다지 명확하지 않습니다. 여러 출처에서 여러 가지 방법으로 설명합니다.

  • 이것unixgeeks.org게시물에는 다음과 같이 명시되어 있습니다.

    Cron은 "단계" 값도 지원합니다. dom 필드의 */2 값은 명령이 2일마다 실행된다는 의미이고, 마찬가지로 시간 필드의 */5 값은 명령이 5시간마다 실행된다는 의미입니다.

    • 그럼 무엇이 숨겨져 있나요?진짜이틀에 한번?
  • 이 답변선언된 cronjob은 0 0 */2 * *"매 홀수일 00:00에 실행됩니다(2단계의 기본 범위는 1,3,5,7,...,31)."

    • 크론은 항상 매월 1일에 시작되나요?
    • 블로그에는 크론이 31일에 실행되고 다음 달 1일에 다시 실행된다고 나와 있는 것 같습니다(따라서 이틀 연속). 간격은 해당 날짜의 값을 기준으로 하기 때문입니다.
  • 다른 예시이 블로그 게시물에서

    • 0 1 1 */2 * command to be executed두 달에 한 번 1일 오전 1시에 실행되어야 합니다.
    • 이는 cron이 1, 3, 5, 7, 9, 11개월에 실행된다는 의미입니까?

*/3cron 은 간격 값을 일(또는 초, 분, 시간 또는 월) 값과 비교하여 간격 cronjob( )을 수행 하도록 설계된 것으로 보입니다 . 이게 100% 맞나요?

폴리스티렌이것은 (내 생각에) 약간의 설명이 필요한 cron의 특정 기능에 대한 매우 구체적인 질문입니다. 이를 통해 Google은 "3개월마다" 크론이 크론탭에 추가된 후 처음으로 실행된다는 것을 100% 확실하게 알려줄 수 있습니다.

답변1

이것crontab(5) 매뉴얼 페이지매우 명확한 표현을 사용하십시오.

단계 값은 범위와 함께 사용될 수 있습니다. "/number" 뒤에 오는 범위는 해당 범위 내에서 숫자 값을 건너뛰도록 지정합니다. 예를 들어, 시간 필드에 "0-23/2"를 사용하여 명령이 매시간 실행되도록 지정할 수 있습니다(V7 표준의 대안은 "0,2,4,6,8,10,12, 14,16,18,20,22"). 별표 뒤에도 단계가 허용되므로 "2시간마다"라고 말하고 싶다면 "*/2"를 사용하세요.

정확한 표현(및 예)은 "범위의 숫자 값 건너뛰기"입니다. 이는 범위의 첫 번째 숫자로 시작한다는 의미입니다.

즉, 범위가 일인 경우 1-31or의 경우 반환되는 값은 1,3,5,7..etc입니다. 이는 또한 실행이 완료된 후 범위가 시작 값으로 재설정된다는 것을 의미합니다.1-31/2*/2

따라서 귀하의 의견도 맞습니다. 이 경우 cronjob은 다음 달 31일과 1일에 실행됩니다.

cron에는 "월중 일"과 "요일"이라는 상호 배타적인 2개의 필드가 있습니다. 따라서 일수 차이가 있는 작업을 실행할 경우에는 이들 중 하나를 선택해야 합니다.

격일로 완벽하게 실행되는 cronjob을 정의하려면 여러 행을 사용하고 현재 달력을 기반으로 매월 사용자 정의해야 합니다.

답변2

오늘(2020-07-31)은 30에는 많은 요소가 있기 때문에 이 질문을 하기 가장 좋은 날입니다.

(기억에서) 내 이해는 (a) *가 1-31 범위로 확장되고 (b) /3이 해당 목록의 건너뛰기 증분이라는 것입니다. 따라서 3-31/3을 쓰면 3일, 6일, 9일, .., 27일(2월) 또는 30일(다른 달)에 실행됩니다. man -s 5 crontab은 범위를 암시하지만 기본 값 밖에서 시작하는 예제는 포함하지 않습니다.

건너뛴 각 값에 대해 crontab을 설정했습니다(Linux Mint 18.1).

30 13 */1 * * date > /home/paul/cron.1.log
30 13 */2 * * date > /home/paul/cron.2.log
30 13 */3 * * date > /home/paul/cron.3.log
...
30 13 */30 * * date > /home/paul/cron.30.log
30 13 */31 * * date > /home/paul/cron.31.log

점프가 1, 2, 3, 5, 6, 10, 15 및 30인 경우에만 실행됩니다. 이는 (31-1)의 모든 요소와 같습니다.

그런 다음 각 범위를 7-31/로 변경하여 점프가 1, 2, 3, 4, 6, 8, 12 및 24일 때 트리거되었습니다. 이것이 (31-7)의 요소들이다.

8-31 범위의 경우 (31 - 8)이 소수이기 때문에 샷 1과 23만 건너뜁니다.

답변3

여기에서 일부 코드를 보고 싶은 사람들에게는 다른 답변의 결론이 확인됩니다.

cron.h다양한 유형(예: HOUR, MONTH, DAY)의 첫 번째 및 마지막 요소를 정의합니다.

#define FIRST_HOUR  0
#define LAST_HOUR   23
#define HOUR_COUNT  (LAST_HOUR - FIRST_HOUR + 1)

#define FIRST_DOM   1
#define LAST_DOM    31
#define DOM_COUNT   (LAST_DOM - FIRST_DOM + 1)

#define FIRST_MONTH 1
#define LAST_MONTH  12
#define MONTH_COUNT (LAST_MONTH - FIRST_MONTH + 1)

존재하다입구.c, '*'는 이러한 제한 사항을 사용하여 범위로 해석됩니다.

if (ch == '*') {
    /* '*' means "first-last" but can still be modified by /step
     */
    num1 = low;
    num2 = high;

단계 크기(num3)의 기본값은 1이지만 crontab에 있는 경우 재정의할 수 있습니다.

    ch = get_number(&num3, 0, PPC_NULL, ch, file);
    if (ch == EOF)
        return EOF;
} else {
    /* no step.  default==1.
     */
    num3 = 1;

그런 다음 주어진 단계 크기를 사용하여 처음부터 마지막까지 반복하여 모든 유효한 요소를 생성합니다. 따라서 첫 번째 요소는 항상 범위의 시작입니다.

/* range. set all elements from num1 to num2, stepping
 * by num3.  (the step is a downward-compatible extension
 * proposed conceptually by bob@acornrc, syntactically
 * designed then implmented by paul vixie).
 */
for (i = num1;  i <= num2;  i += num3)
    if (EOF == set_element(bits, low, high, i))
        return EOF;

관련 정보