如何讓 crontab 在每月的第 6、7 和 8 個工作天運行?

如何讓 crontab 在每月的第 6、7 和 8 個工作天運行?

我正在建立一個 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

相關內容