如何在Control-M中调度从月末最后工作日到月末最后日历日的每日作业?
Control-M作业调度:实现当月最后工作日至月末的运行周期
要配置作业在当月最后一个工作日到当月最后日历日期间每日运行(比如示例中9月最后工作日为28日,则运行28、29、30日),可以通过以下几种可靠方式实现:
方法一:自定义日历匹配法
这是最直观的Control-M原生实现方式:
- 新建自定义日历:在Control-M日历管理模块中,为每个月标记从「当月最后工作日」到「当月最后一天」的所有日期。若需批量维护,可使用
ctmcal命令导入预定义的日历配置文件,避免手动逐个月份配置。
- 新建自定义日历:在Control-M日历管理模块中,为每个月标记从「当月最后工作日」到「当月最后一天」的所有日期。若需批量维护,可使用
- 绑定作业调度:在目标作业的调度属性中,设置基础运行周期为「每日」,再将该自定义日历设为作业的包含日历,作业只会在自定义日历标记的日期运行。
方法二:内置变量+调度条件组合
利用Control-M的内置日期变量和条件逻辑,无需额外维护日历:
在作业的调度规则中添加两个逻辑或的条件:
- 条件1:
$DATE = $LAST_WORKDAY_OF_MONTH(匹配当月最后一个工作日,变量名称需根据Control-M版本调整,部分版本为%LAST_WORKDAY%) - 条件2:
$DATE > $LAST_WORKDAY_OF_MONTH AND $DATE <= $LAST_DAY_OF_MONTH(匹配最后工作日之后到月末的所有日期)
设置完成后,作业会自动判断当日是否符合任一条件,符合则运行。
方法三:脚本前置校验法
如果需要结合自定义工作日历做动态判断,可通过前置脚本实现:
编写Shell脚本校验当日是否在目标周期内,示例脚本如下:
#!/bin/bash # 替换为你的Control-M工作日历名称 WORK_CAL="YOUR_WORK_CALENDAR" # 获取当月最后一个工作日(基于指定工作日历) LAST_WORKDAY=$(ctmpsm -listcal -calname $WORK_CAL -date $(date +%Y%m01) -lastworkday) # 获取当月最后一天 LAST_DAY=$(date -d "$(date +%Y-%m-01) +1 month -1 day" +%Y%m%d) # 获取当日日期 TODAY=$(date +%Y%m%d) # 校验日期范围 if [ $TODAY -ge $LAST_WORKDAY ] && [ $TODAY -le $LAST_DAY ]; then exit 0 # 符合条件,允许作业运行 else exit 1 # 不符合条件,跳过运行 fi
将该脚本配置为作业的前置条件,设置为「脚本返回0时允许运行」即可。
内容的提问来源于stack exchange,提问作者Sujingo Tmrkill
相关产品推荐
相关产品推荐

