Cron作业#
Cron作业类似于Linux里的crontab,是由日历定义的重复性作业,一般用于定期的增量学习等。
SkyForm AIP支持两种形式的cron作业定义,单个和批量。
cron作业流程#
Cron作业的流程见下图:

备注
每个cron作业都需要定义一个作业名。这个作业名必须是唯一,用于对此cron作业的操作。
用户由cron作业定义用命令aip cronjob create一个cron作业。
Cron作业调度器根据cron作业里schedule的定义把一个作业实例提交给AIP的调度器运行。实例受到AIP调度策略的制约。
用户可以通过命令aip cronjob disable | enable {cron job name}来停止和启动cron的schedule。
用户可以用命令aip cronjob start {cron job name}来强制执行一次作业实例。这个实例不影响cron schedule生成的作业实例, 但会影响cron作业策略(见下面关于策略的说明)
命令aip cronjob kill {cron job name}杀掉所有正在运行的cron作业实例。
若要删除系统里cron作业定义,用命令aip cronjob remove {cron job name}
cron作业定义和策略#
在生成一个cron作业时,用户需要通过编辑cron作业定义,在定义中,需要指定一个唯一cron作业名和AIP作业定义,用户还可以配置此作业的策略。 cron作业的定义是一个JSON文件。
aip cronjob create
{
# Mandatory.
"Name": "",
# Mandatory. A valid cron command with time and date fields.
"Schedule": "",
# Mandatory. The job specification. The value can be the path to a valid JSON
# job specification file, or a JSON object that describes the job.
"JobSpec": "",
# Optional. The deadline in minutes to start an instance of a cron job if it
# misses its scheduled run for any reason.
# Default: unlimited.
# "StartDeadline": 5,
# Optional. The policy to start a new instance of a cron job if a previous
# instance of the job is still running. Valid values are skip, run andreplace.
# Default: skip.
# "Overlap": "skip",
# Optional. The maximum allowed number of concurrent running instances of a
# cron job. This parameter only takes effect when Overlap is set to run.
# Default: unlimited.
# "MaxConcurrentRuns": 2,
# Optional.
# The maximum number of consecutive failures of a cron job (exits
# with non-zero exit code) before it is disabled.
# "MaxFails": 2,
# Optional.
# The number of finished instances of a cron job stored inside the cron
# job daemon.
# Default: 5.
# "HistoryLimist": 5,
# Optional.
# Enable debug.
# Default: false.
"Debug": false
}
Name: cron作业名,必须项,是一个由字母(可以大小写)和数字组成的字串,作业名不可含有其它字符。作业名必须定义, 不定义作业名则不能生成cron作业。
Schedule:作业实例运行的时间表,必须项,用Linux里的crontab语法。例子:
“5 0 * * *”:每天0:05运行
“15 14 1 * *”:每月1日的14:15运行
“0 22 * * 1-5”:每周一至周五22:00运行
“23 0-23/2 * * *”:0:23开始运行,之后每2小时运行一次
“5 4 * * sun”:每周日4:05运行
JobSpec:AIP的作业定义,必须项。可以是JSON字串或AIP作业定义文件。如:
“JobSpec”: “./myjobspec.json”,
“JobSpec”: {“Command”:”python model.py”},
StartDeadline:可选项。定义若是由于某种原因(如系统资源不够,或AIP调度器忙等),cron作业实例没有按时运行,多长时间内仍需要运行。 单位是分钟。如:
”StartDeadline”: 60,
是指实例若延误60分钟后不运行了,cron的作业实例会在下个时间点照常运行。缺省是无限长,即每个实例不管延误多久都得运行。
Overlap:可选项。可选值为:
“skip”:若到运行的时间时上一个时间点的实例还在运行,则跳过本实例。这是缺省的策略。
“run”:若到运行的时间时上一个时间点的实例还在运行,则本实例照常运行。这种情况就可能会有同属一个cron作业的2个或多个实例同时运行。
“replace”:若到运行的时间时上一个时间点的实例还在运行,杀掉前一个未结束的实例,启动本实例。
MaxConcurrentRuns:当多个实例的运行在时间上有重叠时,最多可重叠的实例个数。缺省是无限多。
MaxFails:可选项。当连续多个实例失败(不能提交给AIP调度器或运行结果和状态为非0)后,cron作业会被禁止。缺省是无限多,即不会被禁止。禁止后的cron作业可以用命令aip cronjob enable {job name} 来恢复。
HistoryLimit:可选项。定义cron调度器内存里存放cron作业实例的数量,缺省是5个。定义大的数字增加调度器使用的系统内存。
Debug:可选项。提供进一步的排错信息,是给AIP开发人员使用的,缺省值是“false”。
作业定义可以是文件,STDIN(标准输入),或命令行参数。如一个简单的cron可以用以下的方式提交:
aip cronjob create cronjobspec.json
aip cronjob create < cronjobspec.json
aip cronjob create '
\ {"Name":"mycron",
\ "Schedule":"1 0 \* \* \*",
\ "JobSpec":{"Command":"sleep 1"}
\ }'
在提交cron作业时,若要修改以前系统里有效的同名的cron作业,可以用命令:
aip cronjob create -o cronjobspec.json
若系统中没有同名的cron作业,则新建一个;
或:
aip cronjob update cronjobspec.json
若系统中没有同名的cron作业,命令会被拒绝
查看cron作业#
例子:
aip cronjob info

aip cronjob info -l

批量cron作业#
若需要用同一个cron的时间和策略定义运行多个作业,需要定义一个批量cron作业。批量作业共享的部分由Common里的变量定义, 而不同的部分放到各自的文件里。例子:
批量cron作业定义文件packcron.json
{ "Common": { "Schedule": "0 1 \* \* \*", "JobSpec": "", "StartDeadline": 60, "Overlap": "skip", }, "Individual": { # Mandatory. The value is a valid file path and each line in the file is one cronjob name. "Name": "cronnames.txt", # Mandatory. The individual fields of job specification. "JobSpec": { # Mandatory. The value is a valid file path and each line in the file is one job command. "Command": "croncmds.txt" } } }
由于每个cron作业必须定义一个作业名,我们生成一个作业名列表文件,每行对应一个唯一的作业名cronnames.txt
node0001cpu node0001mem node0001disk node0002cpu node0002mem node0002disk
产生一个cron作业命令行列表文件,每行对应cronnames.txt里作业名的作业命令
python monitors.py node0001 cpu python monitors.py node0001 mem python monitors.py node0001 disk python monitors.py node0002 cpu python monitors.py node0002 mem python monitors.py node0002 disk
用命令产生批量cron作业
aip cronjob pack packcron.json
查看作业:
aip cronjob info
作业定义的例子可见 AIP 例子 里 general/cronpackjobs.spec.json。