加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何在cron中每个月的第一个工作日运行脚本?

发布时间:2020-12-15 21:44:05 所属栏目:安全 来源:网络整理
导读:我必须在每个月的第一个工作日设置cronjob,这意味着脚本应该在每个月的第一个工作日运行. 如果假设第一次工作是假期,那么脚本应该在第二个工作日运行. 例如:2015年1月1日是假日,那么脚本应该在2015年1月2日运行. 解决方法 首先,运行date命令: $date '+%x'1
我必须在每个月的第一个工作日设置cronjob,这意味着脚本应该在每个月的第一个工作日运行.

如果假设第一次工作是假期,那么脚本应该在第二个工作日运行.
例如:2015年1月1日是假日,那么脚本应该在2015年1月2日运行.

解决方法

首先,运行date命令:

$date '+%x'
12/29/2014

%x告诉日期以当前语言环境的格式显示今天的日期.使用完全相同的格式,将假期列表放在名为holidays的文件中.例如:

$cat holidays
01/01/2015
07/04/2015

接下来,创建以下shell脚本:

#!/bin/sh
dom=$(date '+%d') # 01-31,day of month
year=$(date '+%Y') # four-digit year
month=$(date '+%m') # two-digit month

nworkdays=0
for d in $(seq 1 $dom)
do
    today=$(date -d "$year-$month-$d" '+%x') # locale's date representation (e.g. 12/31/99)
    dow=$(date -d "$year-$month-$d" '+%u')   # day of week: 1-7 with 1=Monday,7=Sunday
    if [ "$dow" -le 5 ]  && grep -vq "$today" /path/holidays
    then
        workday=Yes
        nworkdays=$((nworkdays+1))
    else
        workday=
    fi
done
[ "$workday" ] && [ "$nworkdays" -eq 1 ] && /path/command

其中/ path /命令由您希望在该月的第一个工作日运行的任何命令替换.另外,将/ path / holidays替换为假日文件的正确路径.

最后,告诉cron每天运行上面的脚本.您的命令将仅在该月的第一个工作日执行.

这个怎么运作

让我们看一下脚本的核心:

>对于d in $(seq 1 $dom);做

这将启动一个循环,将变量d从1运行到当前的每月.
> today = $(date -d“$year- $month- $d”’%x’)#locale的日期表示(例如12/31/99)

这将今天设置为本月和第d天的日期字符串.
> dow = $(date -d“$year- $month- $d”’%u’)#day of day:1-7 with 1 = Monday,7 = Sunday

这将d设置为第d天的星期几,其中1 =星期一,7 =星期日.
> if [“$dow”-le 5]&& grep -vq“$today”/路径/假期

测试“$dow”-le 5]验证第d天是工作日(周一至周五).测试grep -vq“$today”/ path / holidays验证day.d日期是否未出现在holiday文件中.如果两个测试都为真,那么第d天是工作日,然后执行then子句:
>然后工作日=是; nworkdays = $((nworkdays 1))

then子句将工作日设置为是,并且还增加了本月到目前为止的工作日数:nworkdays
>其他工作日=

else子句将workday设置回空字符串.
> fi

fi表示if语句的结束.
>完成

完成表示for循环的结束.
> [“$workday”]&& [“$nworkdays”-eq 1]&& /路径/命令

for语句中的最后一个循环是今天的日期.因此,如果在循环结束后workday = Yes,那么今天是工作日.此外,如果nworkdays = 1,那么今天是本月的第一个工作日.如果两个条件均为真,则执行命令/ path /命令.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读