我正在建立一個 cron 表達式,該表達式必須僅在一系列工作日內每 30 分鐘運行一次,例如:每月的第 6 個、第 7 個和第 8 個工作日。
目前我有一個 cron 表達式,但無論是否是工作日,它只會運行該月的第 6、7 和 8 天。
目前的 cron 表達式:
0 0/30 * 6-8 * ?
我嘗試過使用最近的工作日表達方式
0 0/30 * 6W * ?
但它在一段時間內不起作用 - 例如從6W-8W。
非常感謝這方面的任何幫助。
PS 不想使用腳本來做到這一點。
答案1
嗯..不,你不能。無法在單一 cron 表達式中指定工作日範圍。 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 天,但這還不夠,因為您需要計數或表達
本月(星期幾: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