具有作业依赖性的简单基于 Linux 的任务调度程序?

具有作业依赖性的简单基于 Linux 的任务调度程序?

我正在维护一个数据仓库系统,它涉及许多相关作业(数据导入、转换等)。我一直使用 Linuxcrontab来管理它们,直到作业之间的依赖关系变得复杂。

基本上,我正在寻找一些cron可以帮助我解决以下情况的替代品:

  • 在(简单)处运行作业 A。00:05通常这是导入作业。

  • 安排作业 B、C、D 在作业 A 完成后运行。作业 D 仅在作业 A 完成后 30 分钟运行(以分配负载)。这些是转换作业。

  • 当 B、C、D 全部完成后,作业 E 运行。通常,此作业将汇总数据带入 Web 前端数据库。

所有这些都发生在同一个节点上。

我想象它看起来像一个拓扑图。

A--> B -------------->---> E
 \-> C -------------/   /
 \-> (delay 30mins) -> D

有没有支持这个的基于 Linux 的简单工具?我研究过Airbnb 的 Chronos但这似乎超出了我的需要。

编辑:上述场景只是正在发生的事情的简化版本。我们有很多日常工作,依赖关系也复杂得多。所以我实际上正在寻找一些“强化版 cron”,而不是逐个案例的 bash 脚本来满足每种情况。

答案1

正如 Michael Kjörling 在评论中所建议的,你应该能够使用一个简单的 bash 脚本来做到这一点。就像这样:

#!/usr/bin/env bash

## Log file to which the "echo" commands bellow will write
logfile="/tmp/$$.log"

## Change "ls /etc >/dev/null " to reflect the actual 
## jobs you want to run but keep the  "&& echo job N finished" as is.
jobA="ls /etc >/dev/null"
jobB="ls /etc >/dev/null && echo 'job B finished' >> $logfile"
jobC="ls /etc >/dev/null && echo 'job C finished' >> $logfile"
jobD="ls /etc >/dev/null && echo 'job D finished' >> $logfile"
jobE="ls /etc >/dev/null";

## Run job A, launch jobs B and C as soon as A is finished
## and launch job D 30 minutes after A finishes.
eval $jobA && (sleep 30 && eval $jobD) & eval $jobB & eval $jobC &


## Now, monitor the logfile and run job E when the rest have finished
while true; do
    lines=`wc -l $logfile | cut -f 1 -d ' '`;
    echo "$logfile : $lines"
    ## The logfile will contain 4 lines if all jobs have finished
    if [ "$lines" -eq 3 ];
    then
      ## Run job E
      eval $jobE 
      ## Delete the logfile
      rm $logfile
      ## exit the script
      exit 0;
    fi
    ## Only check if the jobs are finished once a minute
    sleep 60;
done

如果你cron在 00:05 启动此脚本,它应该会执行你想要的操作。这里的主要技巧是使用子壳 ()&&。Subshel​​s 允许您运行多个后台作业,并且&&仅在另一个作业成功退出后才运行作业。

答案2

这些看起来很有趣:

这些都是 python 项目(digdag 除外),旨在用漂亮的 GUI 替换 cron 来查看依赖关系图。

我曾经使用 bash 来做这些事情,但是当你发展到复杂的系统时它就变得丑陋了。

答案3

BMC Software 推出了一款名为 Control-M 的产品,它完全符合您对问题的描述。但是,它不是免费的 :(

我们使用它来管理大约 500 个生产作业,以及大约 400 个测试作业。您可以在任何需要的机器上安装客户端,然后在 Control-M 服务器上设置作业以在客户端上运行。有很多可配置的参数和调度标准,所有这些都可以通过 GUI 或命令行进行管理。最适合您的问题的部分是,它擅长为作业设置输入/输出条件,这样您只需在作业之间进行拖放即可拥有依赖关系。我们使用它来一次设置 20 多个作业的工作流。

相关内容