如何在Control M中调度作业仅在前一天为工作日(基于日历)时运行?
实现仅在前一天为工作日时调度作业的方案
核心逻辑
先判断前一天是否为工作日(排除周末+自定义节假日),再触发作业。以下是不同工具的具体实现:
1. Linux/Cron 环境
Cron本身无内置日期判断,需结合脚本实现:
- 编写Shell脚本,先校验前一天日期:
#!/bin/bash # 获取前一天的标准日期格式 YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) # 判断是否为周末(周六=6,周日=0) DAY_OF_WEEK=$(date -d "$YESTERDAY" +%w) if [ $DAY_OF_WEEK -eq 0 ] || [ $DAY_OF_WEEK -eq 6 ]; then exit 1 # 前一天是周末,终止执行 fi # 可添加自定义节假日校验(将节假日存入文件) if grep -q "$YESTERDAY" /path/to/holidays.txt; then exit 1 # 前一天是节假日,终止执行 fi # 执行目标作业 /path/to/your/task.sh
- 在Cron中调度该脚本(示例:每天早8点运行):
0 8 * * * /path/to/your/check_script.sh
2. Apache Airflow 环境
用BranchPythonOperator结合日期库做分支判断:
from airflow import DAG from airflow.operators.python import BranchPythonOperator, PythonOperator from datetime import datetime import pendulum def check_yesterday_workday(): yesterday = pendulum.yesterday() # 校验周末 if yesterday.day_of_week in (pendulum.SATURDAY, pendulum.SUNDAY): return "skip_task" # 自定义节假日列表 holidays = [ pendulum.date(2024, 1, 1), pendulum.date(2024, 2, 10) ] if yesterday.date() in holidays: return "skip_task" return "run_task" def run_target_job(): # 写入你的作业逻辑 print("执行目标任务") def skip_job(): print("前一天非工作日,跳过任务") default_args = { 'owner': 'airflow', 'start_date': datetime(2024, 1, 1), } with DAG('workday_dependent_job', default_args=default_args, schedule_interval='0 8 * * *') as dag: check_step = BranchPythonOperator( task_id='check_yesterday_status', python_callable=check_yesterday_workday ) run_step = PythonOperator( task_id='run_task', python_callable=run_target_job ) skip_step = PythonOperator( task_id='skip_task', python_callable=skip_job ) check_step >> [run_step, skip_step]
3. Windows 任务计划程序
- 编写PowerShell脚本
CheckAndRun.ps1:
# 获取前一天日期 $yesterday = (Get-Date).AddDays(-1) # 校验周末(周日=0,周六=6) if ($yesterday.DayOfWeek -eq 0 -or $yesterday.DayOfWeek -eq 6) { exit } # 自定义节假日校验 $holidays = @( Get-Date "2024-01-01", Get-Date "2024-02-10" ) if ($holidays -contains $yesterday.Date) { exit } # 启动目标作业 Start-Process "C:\path\to\your\job.exe"
- 在任务计划程序中创建任务,触发器设为每日指定时间,操作选择启动PowerShell并执行该脚本。
关于Confirmation Calendar的补充
如果之前用的是调度工具自带的Confirmation Calendar,大概率是没把校验规则指向前一天,或是节假日列表未完整配置——需调整校验的日期维度,确保覆盖所有需排除的非工作日。
内容的提问来源于stack exchange,提问作者Juan Carlos Ramírez Tinoco
相关产品推荐
相关产品推荐

