根据日历自动将 autosys 作业置于 ON_ICE

Posted

技术标签:

【中文标题】根据日历自动将 autosys 作业置于 ON_ICE【英文标题】:Put an autosys job ON_ICE automatically depending on a calendar 【发布时间】:2020-09-07 00:16:43 【问题描述】:

我正在处理每晚运行的 autosys 上的作业路径。

其中一个作业只需要在每个月初的特定日期运行(通常是前 4 天,但可能会根据业务而变化),因此目前我将所述作业手动设置为 ON_ICE 或 OFF_ICE,我'我希望将其自动化。

我目前有 2 个想法,但无论选择哪种方式都卡住了。

选项 1(最干净的?)

我会在daily_job 和monthly_job 之间创建一个新工作,称为calendar_check。 该作业将在我的应用服务器上启动批处理,检查日历所在应用的数据库,并根据数据库检查将好命令发送回 autosys,以将下一个作业置于 ON 或 OFF_ICE。

我的批次是这样的

%My_SQLPATH% -S %My_SQL_SERVER% -d %My_SQL_DB -h-1 -W -Q "SQL Query that returns 1 or 0 depending on the calendar in my application" output.txt
set /P bEndMonth= < output.txt
echo %bEndMonth%
del output.txt
IF %bEndMonth% == 0 (start "somthing i don't know what 'sendevent -j ON_ICE -e monthly_job'") ELSE (start "somthing i don't know what 'sendevent -e OFF_ICE -j monthly_job'")

最后一行是我不知道如何编写的,或者是否有可能返回我的 autosys 服务器并使用 sendevent 命令。

为了清晰起见的小图

选项 2(更混乱但可能更容易)

我创造了 2 个新工作。一,在我的工作道路上,每天把monthly_job ON_ICE。 另一个不在我的工作路径上,读取 autosys 日历并仅在日历日期运行以将monthly_job OFF_ICE。 缺点是我必须在 autosys 中维护另一个日历,但这很小。

但我还是不知道 jil 要求一项工作将另一项工作置于冰上或下冰的语法。

为了清楚起见,再次绘制小图

欢迎任何帮助或任何其他关于我如何实现这一点的想法。 谢谢!

【问题讨论】:

如果我对这个问题的理解正确,为什么不使用任务调度器呢? @NekoMusume 不知道如何回答你对不起。我只是我们夜间连锁店的一小部分,我刚刚为我的应用程序添加了“monthly_job”,所以我一直在使用其他人使用的相同工具。您能否明确说明任务调度程序与 autosys 的工作方式有何不同并帮助我? 抱歉,我以前没有使用过 Autosys,但从我的搜索结果来看,它们看起来非常相似。如果您的系统管理员允许,您也应该检查任务计划程序,因为它是内置在 Windows 中的。 @NekoMusume 所以我检查了这个,不幸的是这是不可能的。我必须在这种情况下使用 autosys。该作业需要由外部操作员控制,并与我们业务中运行的其他应用程序作业保持一致。 【参考方案1】:

为了在Autosys中执行sendevent命令,必须安装autosys cli包,声明局部变量然后登录到特定的实例

调度管理员/中间件团队可以对此进行验证(如果有)。

如果月初运行的天数是固定的,例如前 5 天或前 5 个工作日,则可以考虑延长日历。 p>

替代方式: 由于运行/保持作业的条件基于数据库中 SQL 查询的输出,因此我们将使用用户定义的退出代码,基于该代码触发每月作业。

步骤 1:制作一个脚本来获取 SQL 查询输出,并基于它定义用户退出代码。

LOGIN Database;
EXEC SQL Query;
IF %bEndMonth% == 0
    THEN exit 0;
ELSE 
    exit 1;

一般如果job退出码>大于0,会触发job失败告警,如果需要抑制这个,给这个job添加如下属性:

max_exit_success:1

现在,如果出口为 0 或 1,作业将被标记为成功。 考虑到作业的名称是 Job_Cal_Check 并且定义为每天运行。

第 2 步: 每月的作业/盒子没有日历,它只会在 Job_Cal_Check 作业有出口 1 时触发。添加以下属性

condition: exitcode (Job_Cal_Check) = 1

编辑:修复连续作业的错误运行

创建一个中间作业休眠 x 秒,计算完成 Job_Cal_Check 后每月作业开始所需的 +-2 或 3 秒时间。

工作流程是:

Non Monthly Job
Previous Chain -> Job_Cal_Check -> Sleep_Job -> Followup_Jobs *(would wait only for Sleep_Job as the Monthly job would have completed status from the previous run)*

Monthly Job
Previous Chain -> Job_Cal_Check -> Sleep_Job + Monthly_Job *(both these jobs would we activated simultaneously)* -> Followup_Jobs *(would wait for both the jobs to complete)*

职位属性如下:

Sleep_Job:
condition: success (Job_Cal_Check)

Followup_Jobs
condition: success (Sleep_Job) AND success(Monthly_Job)

在非月度工作的日子里, Followup_Jobs 只会等待 Sleep_Job 完成。

在每月工作的日子里, Followup_Jobs 将首先等待 Sleep_Job 完成,此时 Montlhy_Job 将已激活/正在运行/已完成,完成后,作业流程将继续。

希望这会有所帮助,如果还有什么需要请询问。

【讨论】:

这看起来很完美!明天早上我会对此进行测试,如果它有效,则标记为已解决,但我认为它会。非常感谢! 所以我仍然对这个解决方案有疑问。在每日/每月工作之后,还有一些工作需要在其他工作结束时才开始。我怎样才能开始下一份工作?我不能把它放在每月工作的成功上,因为那样当每月不运行时它就不会开始。而且我不能把它放在每天的成功上,因为它会在每月开始的同时开始。 好吧,稍微延迟一下可以帮助解决这个问题...让我更新答案...请稍后检查 非常感谢。你的解决方案解决了一切:)

以上是关于根据日历自动将 autosys 作业置于 ON_ICE的主要内容,如果未能解决你的问题,请参考以下文章

Autosys工作计划在每个月的最后4天之外运行

Autosys 对大型机作业的依赖性

使用 PHP 自动安排作业的正确方法是啥 [关闭]

所选对象自动置于前面

Google将自动完成功能置于反应组件中

在拖放作业框时,如何根据jquery中作业框中的数据列值自动调整或覆盖时间表块?