저는 특정 영업일(예: 매월 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