如何让 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 * ?

但它在一段时间内不起作用——比如从6瓦至8瓦

任何在这方面的帮助都将不胜感激。

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 周的天数,但这还不够,因为你需要计算或表达

本月 (days-of-week: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

相关内容