crontab を毎月 6、7、8 日の営業日に実行するにはどうすればよいですか?

crontab を毎月 6、7、8 日の営業日に実行するにはどうすればよいですか?

特定の営業日の範囲(例:月の 6 日目、7 日目、8 日目)にのみ 30 分ごとに実行する必要がある cron 式を構築しています。

現在、cron 式はありますが、営業日かどうかに関係なく、月の 6 日、7 日、8 日のみ実行されます。

現在の cron 式:

0 0/30 * 6-8 * ?

最も近い営業日の表現を使用してみました

0 0/30 * 6W * ?

しかし、これは特定の日数には適用されません。6W-8W

この点に関してご助力いただければ幸いです。

PS スクリプトを使用して実行するつもりはありません。

答え1

うーん... できません。単一の cron 式で営業日の範囲を指定する方法はありません。cron 式は、月日と曜日のフィールドに対して固定の日付または間隔を指定することに制限されています。

1 つの解決策としては、次のように、コマンドを実行する営業日ごとに 1 つずつ、3 つの個別の 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の曜日になりますが、数えたり表現したりする必要があるため、それだけでは十分ではありません。

今月の(曜日:1~5)の6日目、7日目、8日目

したがって、スクリプトが必要です。

$ 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

関連情報