我必须将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/command
替换为要在该月的第一个工作日运行的命令。同样,/path/holidays
用正确的holidays
文件路径替换。
最后,告诉cron每天运行上述脚本。您command
将只在每月的第一个工作日执行。
让我们看一下脚本的核心:
for d in $(seq 1 $dom); do
这将启动一个循环,将变量d
从1开始运行到当前日期。
today=$(date -d "$year-$month-$d" '+%x') # locale's date representation (e.g. 12/31/99)
这将设置为该月和today
该年的日期的日期字符串d
。
dow=$(date -d "$year-$month-$d" '+%u') # day of week: 1-7 with 1=Monday, 7=Sunday
设置dow
为星期几,d
其中1 =星期一,7 =星期日。
if [ "$dow" -le 5 ] && grep -vq "$today" /path/holidays
测试将"$dow" -le 5 ]
验证这一天d
为工作日(星期一至星期五)。测试将grep -vq "$today" /path/holidays
验证该d
日期是否未出现在holidays
文件中。如果两个测试都正确,则dayd
是工作日,该then
子句将被执行:
then workday=Yes; nworkdays=$((nworkdays+1))
该then
子句设置workday
为,Yes
并且还增加了本月到目前为止的工作日数:nworkdays
else workday=
该else
子句套workday
回空字符串。
fi
fi
表示if
语句结束。
done
done
表示for
循环结束。
[ "$workday" ] && [ "$nworkdays" -eq 1 ] && /path/command
for
语句中的最后一个循环是今天的日期。因此,如果workday=Yes
循环结束后,那么今天就是工作日。此外,如果是nworkdays=1
,则今天是该月的第一个工作日。如果两个条件都成立,那么将/path/command
执行您的命令。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句