我需要为每个月设置一个cronjob,因为我是脚本新手,我对脚本感到困惑。
例如,我需要将cronjob设置为每个月结束的-5和+2个工作日。
2014年11月11/24日,25,26,27,28,截止到2014年12月11日,02天。
如何为此编写cronjob脚本。
答案 0 :(得分:2)
无需编写脚本,只需将其设置在" crontab"
中crontab -e
* * 24-31 * 1-5 /path/command
* * 1-2 * 1-5 /path/command
" crontab的"可以处理范围和逗号分隔的列表。请参阅" man 5 crontab"或者这个相当不错的指南:
https://help.ubuntu.com/community/CronHowto
根据您所处的位置,工作日可能会有所不同。西方工作周假设在这里,即" 1-5" =周一至周五。
请检查24.天--- 2.天涵盖周末在不同地方的情况。 我还建议你去运行
export EDITOR=nano
开始之前" crontab -e"除非你熟悉" vim"编辑器。
答案 1 :(得分:1)
以下脚本将测试今天是否是本月的最后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
返回true,或者(2)它是该月的前两个工作日之一,或者(3)是该月的最后五个工作日之一。一次拿一件:
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 = 1月,12 = 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
。根据{{1}}的定义,limit
为4.由于4小于或等于4,此测试返回true,正确地指示此星期一是该月的前两个工作日之一。
${limit[$dow]}
如果我们在该月的最后一周内,则返回true。
如果今天是本月的前2个或最后5个工作日之一,则上述三个测试与[ "$currentm" -ne "$nextm" ]
和&&
逻辑组合以返回true。
||
如果do_run && /path/command
返回true,则会执行do_run
。否则,它将不会被执行。