Linux 用于自动处理的Cronjob
我需要为每个月设置一个cronjob,因为我不熟悉脚本,所以对脚本感到困惑 例如,我需要将cronjob设置为每个月末的-5和+2个工作日 2014年11月11日、24日、25日、26日、27日、28日至2014年12月11日,共2天Linux 用于自动处理的Cronjob,linux,bash,shell,unix,cron,Linux,Bash,Shell,Unix,Cron,我需要为每个月设置一个cronjob,因为我不熟悉脚本,所以对脚本感到困惑 例如,我需要将cronjob设置为每个月末的-5和+2个工作日 2014年11月11日、24日、25日、26日、27日、28日至2014年12月11日,共2天 如何为此编写cronjob脚本。无需编写脚本,只需在“crontab”中设置即可 “crontab”可以处理范围和逗号分隔的列表。请参阅“man 5 crontab”或这本相当不错的指南: 根据您所在的位置,工作日可能会有所不同。此处假设西方工作周,即“1-5”
如何为此编写cronjob脚本。无需编写脚本,只需在“crontab”中设置即可 “crontab”可以处理范围和逗号分隔的列表。请参阅“man 5 crontab”或这本相当不错的指南: 根据您所在的位置,工作日可能会有所不同。此处假设西方工作周,即“1-5”=周一至周五 请核对一下。第二天。day涵盖周末在不同地点的情况。 我也建议跑步
export EDITOR=nano
在启动“crontab-e”之前,除非您熟悉“vim”编辑器。以下脚本将测试今天是一个月的最后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\u run()
的shell函数的定义do\u run
这将shell变量dom=$(日期'+%\u d')
设置为月份的第几天。这将是一个从1到31的数字dom
这将shell变量dow=$(日期'+%u')
设置为一周中的某一天,其中1=周一,7=周日dow
这将shell变量currentm=$(日期'+%\m')
设置为1=一月,12=十二月的月份数currentm
这将shell变量nextm=$(日期-d'+7天+%\m')
设置为从现在起7天内的月份数nextm
这定义了shell数组limit=(0442)
。(见下文。)限制
如果当前日期是工作日,则返回true[“$dow”-le 5]
如果一个月的某一天小于或等于一周中该天的限制,则返回true[“$dom”-le“${limit[$dow]}”]
作为一个例子,考虑一个月份,其中第四是星期一。对于这种情况,
和dom=4
。根据dow=1
的定义,limit
为4。因为4小于或等于4,所以该测试返回true,正确地指示本周一是一个月的前两个工作日之一${limit[$dow]}
如果在该月的最后一周内,则返回true 如果今天是一个月的前2个或最后5个工作日之一,则上述三个测试与[“$currentm”-ne“$nextm”]
和&&
逻辑结合,返回true|
如果do_运行&&/path/command
返回true,则将执行do\u run
。否则,它将不会被执行/path/command
cron
每天运行此脚本。此脚本将仅在您想要的日期运行/path/command
。(B) date'+%u'
返回1到7,其中1=周一,7=周日。因此,[“$dow”-le 5]
在工作日是正确的,并且仅在工作日是正确的。这记录在人员日期中。是的,crontab约定是不同的,但这与我们在哪里使用date
和test
([
)无关。
#!/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