너무 길어요.: 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개월에 실행된다는 의미입니까?
*/3
cron 은 간격 값을 일(또는 초, 분, 시간 또는 월) 값과 비교하여 간격 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-31
or의 경우 반환되는 값은 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;