meschedule: 基于时间和依赖关系的简易任务调度器

178 阅读3分钟

现今开源的任务调度器比较有名的如airflow,它其实是一个功能很丰富的工具集了,功能强大加可视化。但有时我只想使用一个简单的任务调度器,可以很快上手使用,不求对上万任务的掌控和跨界点调度,那么就是今天笔者推荐的调度器mescedule


安装

meschedule是使用melang语言进行编写的,所以只需要安装好melang解释器即可运行。melang支持UNIX及windows环境,但由于windows提供的系统API的差异问题,在windows上无法使用meschedule。

关于melang的安装可参考:传送门

启动

启动也是非常简单的,执行如下命令即可:

$ melang scheduler.mln

调度器配置

meschedule启动时会加载config.json中的配置,所以我们先简单介绍一下这个配置:

{    "path": "test", //任务所在目录的路径    "concurrency": 10, //启用多少个协程处理任务    "delta_sec": 15, //cron格式的时间调度器都是在分钟级的,但具体到秒级则可使用这个配置项,当前配置表示在指定分钟的第15秒开始执行任务    "data": {} //这里给出一些自定义变量,这些变量会被用于替换每个任务配置中要执行的shell命令字符串中的变量}

这里需要注意,path指定的路径可以是一个包含子目录的目录。调度器只会获取其中名字不以.开头但以.json结尾的json文件的内容作为每个任务的任务配置。

任务配置

每个任务都是一个简单的json文件,格式如下:

{    "name": "task name", //任务名    "period": "* * * * *", //cron格式的时间配置,但暂时不支持 - 指示的范围符号    "deps": [],//依赖的任务数组,每个数组元素是一个字符串,其值应与被依赖任务的json中的name字段值保持一致    "cmd": "shell command",//具体的shell命令    "data": {}//用于替换shell命令中的自定义变量}

这里需要额外说明一下,调度器配置中的data相当于一个全局范围的变量配置,而任务配置中的data相当于该任务范围的变量配置,因此任务配置的data将具有更高的优先级。

除此以外,任务配置支持一个默认的变量名PWD,这个变量的值是当前任务json文件所在目录路径。

举例:

{    "name": "a", //任务名 a    "period": "* * * * *", //每分钟执行一次    "deps": ["b", "c"], //该任务依赖于任务b和c,即如果a执行时间到来时,任务b和c也要执行或正在执行,那么a必须等到这两个任务执行完成才可以被执行    "cmd": "echo CMD", //CMD 是一个自定义变量,被定义在data中,故这个命令就是 echo a    "data": {        "CMD": "a"    }}

举例

有一个名为test的目录用于存放所有任务配置,结构如下:

test   |- a.json   |- foo        |- b.json        |- d        |- bar            |- c.json

a.json

{    "name": "a",    "period": "* * * * *",    "deps": [],    "cmd": "echo PWD",    "data": {    }}

b.json

{    "name": "b",    "period": "* * * * *",    "deps": ["a"],    "cmd": "echo PWD",    "data": {    }}

c.json

{    "name": "c",    "period": "* * * * *",    "deps": ["b"],    "cmd": "echo PWD",    "data": {    }}

调度器配置如下:

{    "path": "test",    "concurrency": 10,    "delta_sec": 15,    "data": {}}

那么当我们执行了调度器后,每分钟输出的结果就是:

example​example/foo​example/foo/bar​...

第一个是c.json的,第二个是b.json的,第三个是a.json的。

感谢阅读