我需要为每个月设置一个cronjob,因为我对脚本还不熟悉,我对脚本感到困惑。
例如,我需要为每个月末的-5和+2个工作日设置cronjob。
2014年11月11日、24日、25日、26日、27日、28日至2014年12月11日,02天。
如何为此编写cronjob脚本。
最佳答案
下面的脚本将测试今天是本月最后5个工作日还是前2个工作日之一。如果是,它将执行/path/command
。对于此代码,假定工作日为周一到周五。此脚本应每天运行一次:
#!/bin/bash
do_run() {
dom=$(date '+%_d') # 1-31, day of month
dow=$(date '+%u') # 1-7 with 1=Monday, day of week
currentm=$(date '+%_m')
nextm=$(date -d '+7 days' '+%_m')
limit=(0 4 4 2 2 2)
[ "$dow" -le 5 ] && {
[ "$dom" -le "${limit[$dow]}" ] ||
[ "$currentm" -ne "$nextm" ]
}
}
do_run && /path/command
工作原理:
do_run
如果今天是(1)一个工作日,并且(2)它是本月前两个工作日之一,或者(3)是本月最后五个工作日之一,则返回true。一次吃一片:do_run()
这将启动名为
do_run
的shell函数的定义。dom=$(date '+%_d')
这会将shell变量
dom
设置为每月的第几天。这是一个从1到31的数字。dow=$(date '+%u')
这将shell变量
dow
设置为一周中的第几天,其中1=星期一,7=星期日。currentm=$(date '+%_m')
这将shell变量
currentm
设置为1=一月和12=十二月的月份数。nextm=$(date -d '+7 days' '+%_m')
这将shell变量
nextm
设置为7天后的月份数。limit=(0 4 4 2 2 2)
这定义了shell数组
limit
。(见下文。)[ "$dow" -le 5 ]
如果当前日期是工作日,则返回true
[ "$dom" -le "${limit[$dow]}" ]
如果一个月中的某一天小于或等于一周中这一天的限制,则返回true。
例如,考虑一个月,其中第四个月是星期一。在这种情况下,
dom=4
和dow=1
。从limit
的定义来看,${limit[$dow]}
是4。由于4小于或等于4,此测试返回true,正确地表明本周一是本月前两个工作日之一。[ "$currentm" -ne "$nextm" ]
如果我们在这个月的最后一个星期之内,这就返回真值。
如果今天是一个月的前2个工作日或最后5个工作日之一,则上述三个测试与
&&
和||
逻辑组合以返回true。do_run && /path/command
如果
do_run
返回true,则将执行/path/command
。否则,它将不会被执行。