返回

作业依赖完成后延迟启动方案详解:AutoSys实践

Linux

依赖作业完成后设置延迟启动

当多个作业之间存在依赖关系时,经常遇到这样的需求:主作业(如JobFinal)需要等待所有依赖作业(如Job1Job2 等)成功完成,然后在一段时间后才开始执行。单纯的依赖关系满足不了延迟执行的需求,需要引入额外的机制。本文介绍一些实现这一目标的方案。

方案一:使用作业链和计划执行时间

可以建立一个包含延迟作业的新作业链。在这个链中,前一个作业只负责触发下一个作业,并且通过设置其执行时间实现延迟启动。

  1. 创建触发作业: 首先创建一个触发作业(例如TriggerJob)。这个作业的主要功能是作为所有依赖作业的出口,并且没有实质的工作内容。
  2. 设置依赖:TriggerJob 的依赖设置为所有依赖作业(Job1 - Job10)。
  3. 定义计划启动: TriggerJob 在所有依赖作业都完成后被激活。
  4. 使用计划: 接着,将 JobFinal 的启动依赖设置为TriggerJob,并在JobFinal 的定义里,加入延迟的时间参数。 此步骤,关键是通过指定计划执行时间而非使用TriggerJob直接触发JobFinal来加入时间延迟。
// Job Definition: TriggerJob (负责触发后续作业的虚拟作业)
insert_job: TriggerJob
job_type: c
command: echo "Trigger job completed"
condition: s(Job1) and s(Job2) and ... and s(Job10) 

// Job Definition: JobFinal (实际需要运行的目标作业)
insert_job: JobFinal
job_type: c
command: ./my_job.sh
start_times: "HH:MM+01:00"  //  表示在 'TriggerJob' 完成后的1小时启动
condition: s(TriggerJob)

步骤解释:

  1. TriggerJob 利用 condition 参数等待 Job1Job10 完成。当它们全部成功执行后,TriggerJob 也被认为完成。
  2. JobFinalcondition 确保了其只会在 TriggerJob 完成后才会考虑启动。
  3. start_times 定义了一个明确的时间窗口或相对时间,延迟了JobFinal 的实际执行,例子中使用了"HH:MM+01:00",表示在 TriggerJob 完成的时刻的1小时后执行。需要按照具体的任务安排和执行情况配置相应的时间参数,这个参数不依赖于日历或者其他的调度安排,仅在依赖的触发作业完成后开始计算延时。

优点: 使用时间延迟可以很好的控制实际作业的执行,提供了灵活的调度方式,并可以通过时间差来避免高并发的任务,对系统造成压力。

注意事项: 实际环境中,务必根据实际的任务运行时间和预期延迟配置相应的start_times。注意时间偏移量的写法和含义,并根据实际的时区配置。

方案二:利用外部脚本实现时间延迟

此方案通过引入一个脚本来作为依赖项,并在脚本内部实现延时等待,并触发最终的作业。

  1. 编写延时脚本: 编写一个 shell 脚本,其接收一个参数:即延时的时间,此参数是时间戳,可选择使用秒为单位。
  2. 脚本执行延时: 在此脚本中,使用 sleep 命令执行具体的延迟。
  3. 触发目标作业: 脚本执行完毕,调用 autosysjob 命令启动 JobFinal
#!/bin/bash

#  设置延迟的时间,单位为秒。 此处参数通过外部传入
DELAY_SECONDS="$1"  # 此处为传递给脚本的时间参数

echo "Starting delay of $DELAY_SECONDS seconds..."
sleep "$DELAY_SECONDS"  # 进行延迟

# 使用 autosysjob 启动最终作业, 实际需要部署AutoSys命令行环境。
/opt/CA/WorkloadAutomationAE/autosys/bin/autosysjob -a start -j JobFinal

echo "JobFinal has been started."

// Job Definition: DelayJob (执行延迟脚本的作业)
insert_job: DelayJob
job_type: b
command: /path/to/delay_script.sh 3600 // 3600为延时秒数,此为外部传入的参数
condition: s(Job1) and s(Job2) and ... and s(Job10)

步骤解释:

  1. 首先准备一个 shell 脚本。 该脚本需要能够接受参数。这个脚本等待指定的时间长度。这里的时间是以秒为单位的,即需要延时一小时就使用3600秒,两小时则使用7200
  2. DelayJobcondition 参数确保了它在 Job1Job10 完成之后运行。
  3. DelayJob 运行 delay_script.sh,此脚本内部使用了sleep方法执行具体的延迟等待,脚本等待结束后,通过 AutoSys 的客户端程序启动目标作业。
  4. 外部脚本中的 delay 时间可配置,使得最终任务启动的时间可以非常精确。

优点: 提供了极高的灵活度。不仅可延迟启动任务,还可以做更复杂的前置操作,譬如时间计算,条件判断等。

注意事项: 脚本需要确保具备可执行权限。确保 autosysjob 能够顺利启动目标作业。 同时注意环境依赖,避免 AutoSys 命令由于环境问题执行出错。需要仔细确认 delay 的时间长度,如果存在特殊的要求,可以通过时间计算,或者读取文件的方式作为脚本执行的时间参数。