返回
作业依赖完成后延迟启动方案详解:AutoSys实践
Linux
2025-01-13 01:19:36
依赖作业完成后设置延迟启动
当多个作业之间存在依赖关系时,经常遇到这样的需求:主作业(如JobFinal
)需要等待所有依赖作业(如Job1
、Job2
等)成功完成,然后在一段时间后才开始执行。单纯的依赖关系满足不了延迟执行的需求,需要引入额外的机制。本文介绍一些实现这一目标的方案。
方案一:使用作业链和计划执行时间
可以建立一个包含延迟作业的新作业链。在这个链中,前一个作业只负责触发下一个作业,并且通过设置其执行时间实现延迟启动。
- 创建触发作业: 首先创建一个触发作业(例如
TriggerJob
)。这个作业的主要功能是作为所有依赖作业的出口,并且没有实质的工作内容。 - 设置依赖: 将
TriggerJob
的依赖设置为所有依赖作业(Job1
-Job10
)。 - 定义计划启动:
TriggerJob
在所有依赖作业都完成后被激活。 - 使用计划: 接着,将
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)
步骤解释:
TriggerJob
利用condition
参数等待Job1
到Job10
完成。当它们全部成功执行后,TriggerJob
也被认为完成。JobFinal
的condition
确保了其只会在TriggerJob
完成后才会考虑启动。start_times
定义了一个明确的时间窗口或相对时间,延迟了JobFinal
的实际执行,例子中使用了"HH:MM+01:00",表示在 TriggerJob 完成的时刻的1小时后执行。需要按照具体的任务安排和执行情况配置相应的时间参数,这个参数不依赖于日历或者其他的调度安排,仅在依赖的触发作业完成后开始计算延时。
优点: 使用时间延迟可以很好的控制实际作业的执行,提供了灵活的调度方式,并可以通过时间差来避免高并发的任务,对系统造成压力。
注意事项: 实际环境中,务必根据实际的任务运行时间和预期延迟配置相应的start_times
。注意时间偏移量的写法和含义,并根据实际的时区配置。
方案二:利用外部脚本实现时间延迟
此方案通过引入一个脚本来作为依赖项,并在脚本内部实现延时等待,并触发最终的作业。
- 编写延时脚本: 编写一个 shell 脚本,其接收一个参数:即延时的时间,此参数是时间戳,可选择使用秒为单位。
- 脚本执行延时: 在此脚本中,使用 sleep 命令执行具体的延迟。
- 触发目标作业: 脚本执行完毕,调用
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)
步骤解释:
- 首先准备一个 shell 脚本。 该脚本需要能够接受参数。这个脚本等待指定的时间长度。这里的时间是以秒为单位的,即需要延时一小时就使用
3600
秒,两小时则使用7200
。 DelayJob
的condition
参数确保了它在Job1
到Job10
完成之后运行。DelayJob
运行delay_script.sh
,此脚本内部使用了sleep方法执行具体的延迟等待,脚本等待结束后,通过 AutoSys 的客户端程序启动目标作业。- 外部脚本中的 delay 时间可配置,使得最终任务启动的时间可以非常精确。
优点: 提供了极高的灵活度。不仅可延迟启动任务,还可以做更复杂的前置操作,譬如时间计算,条件判断等。
注意事项: 脚本需要确保具备可执行权限。确保 autosysjob 能够顺利启动目标作业。 同时注意环境依赖,避免 AutoSys 命令由于环境问题执行出错。需要仔细确认 delay 的时间长度,如果存在特殊的要求,可以通过时间计算,或者读取文件的方式作为脚本执行的时间参数。