You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:30:08