A.sh
한 달에 5주, 5개의 수요일이 있으면 첫 번째 주 수요일, 두 번째 주 수요일, 세 번째 주 수요일, 네 번째 주 수요일에 스크립트가 실행되도록 크론을 예약하려고 합니다. 다섯 번째 주 수요일에는 run 을 실행해야 합니다 b.sh
.
기타
A.sh
한 달에 4주와 4개의 수요일이 있는 경우 첫 번째 주 수요일, 두 번째 주 수요일, 세 번째 주 수요일, 그리고 네 번째 주 수요일에 스크립트가 실행되도록 크론을 예약하려고 합니다. b.sh
.
답변1
다음과 같은 것이 필요합니다.
0 1 1-21 * * [ $(date +\%u) -eq 3 ] && "call your command/script here"
이 일정은 0 1 1-21 * *
"1일부터 21일까지 매일 오전 1시에 작업을 실행합니다"를 의미합니다. 이제 질문은 왜 1일부터 21일까지로 제한할까요? 대답은 가장 좋은 경우에 매월 1일이 이미 수요일에 시작되기 때문입니다.1) crontab은 매월 1일 , 8일 , 15일 에 실행 됩니다.
최악의 경우 1주차(7일차)의 마지막 날이 되므로 7일 , 14일 , 7일 에 crontab이 실행됩니다.이십 일매월 3 일이므로 실행일 수를 한 달에 1~21일로 제한합니다.
그러나 man -s 5 crontab
그는 이렇게 말했습니다.
참고: 명령이 실행되는 날짜는 날짜와 요일의 두 필드로 지정할 수 있습니다. 두 필드가 모두 제한된 경우(예: *로 시작하지 않음) 다음과 같은 경우에 명령이 실행됩니다.누구나필드가 현재 시간과 일치합니다.
이것이 바로 우리가 날짜를 선택하고 *를 사용하여 요일을 나타내는 이유입니다.
위에서 지적한 것처럼 crontab에서 요일을 지정하는 대신, 간단한 연산을 수행하여 처리합니다.test
쉘을 통해그리고 [ $(date +\%u) -eq 3 ]
; 요일이 주의 세 번째 날인지 확인합니다. 즉, 수요일(요일은 0-6, 0, ..., 6 Sun)인지 확인하고 다음 명령을 실행합니다. 스크립트.
0 1 * * 3 [ $(date +\%m) -eq $(date -d'+7days' +\%m) ] && scriptA.sh || scriptB.sh
마지막 수요일( , 오늘 수요일 + 7일 후(다음 수요일 )이 같은 달 [ $(date +\%m) -eq $(date -d'+7days' +\%m) ]
인지 확인하여 마지막 수요일이 아닌 경우 scripA.sh가 실행됩니다. 그렇지 않으면 마지막 수요일이면 scriptB.sh가 실행됩니다.$(date +\%m)
$(date -d'+7days' +\%m)
위에서 언급한 것처럼 scriptA.sh는 마지막 수요일을 제외하고 매월 수요일마다 실행되며 그 이후에는 scriptB.sh가 실행됩니다.
물론 crontab 항목을 복잡하게 만드는 대신 이러한 테스트를 script[AB].sh로 이동할 수 있습니다.
참고: 위의 해결 방법은 해당 부분을 제거하여 단일 명령/스크립트를 실행하는 데 적용할 수도 있고 , 실패 시 오류를 통보하여 cron이 이에 반응하는 것을 원하지 않는 || scriptB.sh
경우 해당 부분으로 대체할 수도 있습니다 .|| true
MAILTO