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

huy*_*huy 4 linux scheduled-tasks cron

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

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

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

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

  • 作业 E 在所有 B、C、D 完成后运行。通常这是将聚合数据带到 Web 前端数据库的工作。

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

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

A--> B -------------->---> E
 \-> C -------------/   /
 \-> (delay 30mins) -> D
Run Code Online (Sandbox Code Playgroud)

有没有这么简单的基于 linux 的工具支持这个?我已经研究过Airbnb 的 Chronos,但对于我的需求来说似乎有点过分了。

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

ter*_*don 6

正如 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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

这些看起来很有趣:

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

我曾经使用 bash 来处理这些东西,但是当你成长为复杂的系统时它会变得很丑陋。