1주차, 2주차, 3주차 및 특정 요일에 대해 cron을 예약하는 방법은 무엇입니까?

1주차, 2주차, 3주차 및 특정 요일에 대해 cron을 예약하는 방법은 무엇입니까?

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경우 해당 부분으로 대체할 수도 있습니다 .|| trueMAILTO

관련 정보