매월 6일, 7일, 8일 영업일에 crontab을 실행하려면 어떻게 해야 합니까?

매월 6일, 7일, 8일 영업일에 crontab을 실행하려면 어떻게 해야 합니까?

저는 특정 영업일(예: 매월 6일, 7일, 8일)에만 30분마다 실행해야 하는 cron 표현식을 작성 중입니다.

현재 cron 표현식이 있지만 영업일 여부에 관계없이 해당 월의 6일, 7일, 8일만 실행됩니다.

현재 크론 표현식:

0 0/30 * 6-8 * ?

가장 가까운 영업일 표현을 사용해 보았습니다.

0 0/30 * 6W * ?

하지만 일정 기간 동안은 작동하지 않습니다.6W-8W.

이와 관련하여 어떤 도움이라도 주시면 감사하겠습니다.

PS 스크립트를 사용하여 수행할 계획이 없습니다.

답변1

흠.. 아니 그럴 수 없어요. 단일 cron 표현식에서 영업일 범위를 지정할 수 있는 방법은 없습니다. Cron 표현식은 날짜 및 요일 필드에 대해 고정 날짜 또는 간격을 지정하는 것으로 제한됩니다.

한 가지 해결책은 다음과 같이 명령을 실행하려는 영업일마다 하나씩 세 개의 개별 크론 작업을 만드는 것입니다.

# for the 6th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 5 business day") = "Mon" ] && /path/to/your/command

# for the 7th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 6 business day") = "Tue" ] && /path/to/your/command

# for the 8th business day of the month
0 0/30 * * * [ $(date +\%a -d "$(date +\%Y-\%m-01) + 7 business day") = "Wed" ] && /path/to/your/command

답변2

당신은 할 수 없습니다(또는 적어도 나는 방법을 알 만큼 영리하지 않습니다).

crontab에는 다음을 선택할 수 있는 제약 조건이 있습니다.달의 일그리고요일.

모든 영업일은 1~5주의 날이 되지만 계산하거나 표현해야 하기 때문에 그것만으로는 충분하지 않습니다.

이번 달 6일, 7일, 8일(요일:1~5)

그래서 스크립트가 필요합니다.

$ cat /home/jaroslav/tmp/workday-567.sh
#!/bin/bash

jan01() { date +%s -d `date +%Y-01-01`; }
december() { echo $(($(jan01) + 365*24*3600)); }
day=`jan01`; december=`december`; 
today=${1:-$(date '+%Y-%m-%d')}

this_months_678th=$(
while [ $day -lt $december ];do
    date '+%Y-%m-%d %B %A %u' -d@$day;
    let day=$day+86400; 
done  |
sort -u |
sed -e "/[67]$/d; /$(date '+%Y-%m')/!d" |
sed -n -e '6p; 7p; 8p'
)

if echo -e "$this_months_678th" | grep -q $today; then
    exit 0
fi
exit 1

2018년 11월;

$ for i in 2018-11-{01..31}; 
    do bash /home/jaroslav/tmp/workday-567.sh $i && echo run on $i;
  done 
run on 2018-11-08
run on 2018-11-09
run on 2018-11-12

관련 정보