두 번째 주마다 작업을 실행하도록 cron에 지시하는 방법은 무엇입니까?
매주 화요일 주어진 시간에 실행되는 cron을 통해 작업을 실행하고 싶습니다. 매주 화요일은 쉽습니다.
0 6 * * Tue
그러나 "매주 두 번째 화요일"(또는 선호하는 경우 매 2 주마다)에 만드는 방법은 무엇입니까? 스크립트 자체에서 로직을 구현하고 싶지는 않지만 정의는 cron에만 유지합니다.
이것은 crontab
처음 5 개 필드에 정확히 정의되지 않은 경우에도 유지 됩니다.
0 6 * * Tue expr `date +\%W` \% 2 > /dev/null || /scripts/fortnightly.sh
대답
epoch 이후 격주로 실행되도록 화요일 cron 로직을 수정하십시오 .
일주일에 604800 초가 있다는 것을 알고 (DST 변경 및 윤초 무시, 감사합니다) GNU 날짜 사용 :
0 6 * * Tue expr `date +\%s` / 604800 \% 2 >/dev/null || /scripts/fortnightly.sh
곁에
달력 산술은 답답합니다.
@xahtep의 대답은 훌륭하지만 @Doppelganger가 주석 에서 언급했듯이 특정 연도 경계에서 실패합니다. 의 없음 date
유틸리티의 "올해의 주"지정자 여기 도울 수 있습니다. 1 월 초 일부 화요일은 필연적으로 전년도 마지막 화요일의 주 패리티를 반복합니다 : 2016-01-05 (% V), 2018-01-02 (% U) 및 2019-01-01 (% W) .
pilcrow의 대답 은 훌륭합니다. 그러나 이로 인해 fortnightly.sh 스크립트가 짝수 주 (기원 이후) 마다 실행됩니다 . 이상한 주 에 스크립트를 실행해야하는 경우 답변을 약간 조정할 수 있습니다.
0 6 * * Tue expr \( `date +\%s` / 604800 + 1 \) \% 2 > /dev/null || /scripts/fortnightly.sh
1을 0으로 변경하면 짝수 주로 돌아갑니다.
약간 멍청 할 수도 있지만, 하나는 첫 번째 화요일마다 하나씩, 1/3마다 하나씩 두 개의 크론 잡을 만들 수도 있습니다.
첫 번째 cronjob :
0 0 8 ? 1/1 TUE#1 *
두 번째 cronjob :
0 0 8 ? 1/1 TUE#3 *
여기 구문이 확실하지 않아 http://www.cronmaker.com/ 을 사용 하여 만들었습니다.
일부 엣지 케이스에서 실패 할 수있는 위 접근 방식의 몇 가지 추가 제한 사항을 발견했습니다. 예를 들어 다음을 고려하십시오.
@xahtep과 @Doppelganger는
%W
위의 특정 연도 경계를 사용하여 문제를 논의했습니다 .@pilcrow의 대답은 어느 정도이 문제를 해결하지만 특정 경계에서도 실패합니다. 이 주제 및 기타 관련 주제의 답변은 하루 (대 주)의 초 수를 사용하며 동일한 이유로 특정 경계에서 실패합니다.
이는 이러한 접근 방식이 UTC 시간 (날짜 + % s)에 의존하기 때문입니다. 매주 두 번째 화요일 오전 1시와 오후 10시에 작업을 실행하는 경우를 생각해보십시오.
GMT-2를 가정합니다.
- 현지 시간 오전 1시 = 어제 UTC 오후 11시
- 현지 시간 오후 10시 = 오늘 오후 8시
매일 한 번만 확인하는 경우에는 문제가되지 않지만 여러 번 확인하는 경우 또는 UTC 시간에 가까워서 일광 절약 시간이 발생하는 경우 스크립트는이를 같은 날.
이 문제를 해결하려면 UTC가 아닌 현지 시간대를 기준으로 UTC에서 오프셋을 계산해야합니다 . BASH에서이 작업을 수행하는 간단한 방법을 찾을 수 없었기 때문에 Perl에서 빠른 1 라이너를 사용하여 UTC로부터의 오프셋을 초 단위로 계산하는 솔루션을 개발했습니다.
이 스크립트는 현지 시간대를 출력하는 날짜 + % z를 활용합니다.
Bash 스크립트 :
TZ_OFFSET=$( date +%z | perl -ne '$_ =~ /([+-])(\d{2})(\d{2})/; print eval($1."60**2") * ($2 + $3/60);' )
DAY_PARITY=$(( ( `date +%s` + ${TZ_OFFSET} ) / 86400 % 2 ))
그런 다음 하루가 짝수인지 홀수인지 확인하려면
if [ ${DAY_PARITY} -eq 1 ]; then
...
else
...
fi
주어진 시작일을 기준으로하려는 경우 :
0 6 * * 1 expr \( `date +\%s` / 86400 - `date --date='2018-03-19' +\%s` / 86400 \) \% 14 == 0 > /dev/null && /scripts/fortnightly.sh
2018-03-19부터 격주 월요일에 실행해야 함
표현식 읽기 : 월요일 오전 6시에 실행하면 ...
1-오늘 날짜를 초 단위로 나눈 후 일 sice epoch로 변환합니다.
2-시작 날짜에 대해 동일한 작업을 수행하여 에포크 이후의 일 수로 변환합니다.
3-둘 사이의 차이 얻기
4-14로 나누고 나머지 확인
5- 나머지가 0이면 2 주주기입니다.
3 주마다 어떻습니까?
내 제안은 다음과 같습니다.
0 6 * * Tue expr `date +\%W` \% 3 == 0 > /dev/null || /scripts/fortnightly.sh
... 또는 ...
0 6 * * Tue expr `date +\%W` \% 3 == 1 > /dev/null || /scripts/fortnightly.sh
... 또는 물론 ...
0 6 * * Tue expr `date +\%W` \% 3 == 2 > /dev/null || /scripts/fortnightly.sh
... 주 회전에 따라.
둘째 주 매주 화요일 만 원하는 경우 :
00 06 * * 2 # 2
구문 "/ 2"는 평일과 함께 사용되지 않습니다. 그래서 위의 스마트에 추가 한 것은 MonthDay에 1,15를 사용하는 것입니다.
0 6 1,15 * * /scripts/fornightly.sh> / dev / null 2> & 1
어째서
0 0 1-7,15-21,29-31 * 5
그게 적절합니까?
Cron provides an 'every other' syntax "/2". Just follow the appropriate time unit field with "/2" and it will execute the cronjob 'every other time'. In your case...
0 6 * * Tue/2
The above should execute every other Tuesday.
ReferenceURL : https://stackoverflow.com/questions/350047/how-to-instruct-cron-to-execute-a-job-every-second-week
'IT TIP' 카테고리의 다른 글
VS 솔루션을 열 때마다“최근이 솔루션에 프로젝트가 추가되었습니다. (0) | 2020.12.30 |
---|---|
Makefile If-Then Else 및 루프 (0) | 2020.12.30 |
파이썬은 튜플 목록을 어떻게 정렬합니까? (0) | 2020.12.30 |
내 사용자 정의 속성이 적용된 멤버를 가져 오려면 어떻게합니까? (0) | 2020.12.30 |
컴퓨터가 절전 모드에서 다시 시작될 때 데스크톱 브라우저가 감지 할 수 있습니까? (0) | 2020.12.30 |