如何编写排除每月最后5天的每日4点CronJob表达式?
CronJob排除每月最后5天执行的解决办法
一、支持扩展语法的Cron环境(比如Quartz、部分企业调度系统)
要是你的Cron工具支持L(代表当月最后一天)和偏移量,可以直接用Cron表达式搞定,写法如下:
0 0 4 1-L-5 * *
解释:1-L-5表示从当月第1天到倒数第6天,相当于直接排除了最后5天。注意这个语法只有部分扩展Cron环境支持,标准Linux Crontab和K8s CronJob用不了。
二、标准Cron环境(Linux Crontab、K8s CronJob等)
标准Cron不支持动态计算日期,得靠脚本判断来实现。把你原来的0 0 4 * * *改成下面这样:
0 0 4 * * * [ $(date +\%d) -le $(cal | awk 'NF {DAYS=$NF}; END {print DAYS-5}') ] && /path/to/your/task
简单说下逻辑:
cal | awk ...:先拿到当月总天数,减去5得到允许执行的最后一天date +\%d:获取当天的日期(两位数字)- 只有当天日期小于等于允许的最后一天时,才会执行你的任务
如果是K8s CronJob,把判断逻辑写到Job的启动命令里就行,示例yaml:
apiVersion: batch/v1 kind: CronJob metadata: name: your-job spec: schedule: "0 0 4 * * *" jobTemplate: spec: template: spec: containers: - name: your-container image: your-image command: ["/bin/sh", "-c"] args: - | TODAY=$(date +\%d) MAX_DAY=$(cal | awk 'NF {DAYS=$NF}; END {print DAYS-5}') if [ $TODAY -le $MAX_DAY ]; then /path/to/your/task fi restartPolicy: OnFailure
内容的提问来源于stack exchange,提问作者Scamus
相关产品推荐
相关产品推荐

