Crontab定时任务的可能替代品yacron 为支持Docker而设计

yacron

特点

1、这个”Crontab” 使用的是YAML格式的配置文件;

2、执行任务失败时,会发出提示邮件;

3、配置灵活: 用户可自行定义任务执行成功或失败的标准;

4、专门为在Docker,Kubernetes或其他满足12因素标准的环境中运行而设计的:

  • 前台运行;
  • 所有日志内容记录到stdout/stderr [1];

5、自动重试执行失败的任务, 会有具体的错误码返回。

[1]vixie cron只会记录日志内容到syslog,需要syslog守护进程在后台运行,否则没日志!

状态

目前该项目处于开发阶段:功能并不完善,可能会遇到部分错误或者bug。

安装

yacron 需要 Python版本 >= 3.5. 建议把yacron安装在Python的虚拟环境 , 例如:

用法

配置文件内容为YAML格式, 使用 -c参数指定配置文件或者目录进行启动。 例如:

启动yacron时(前台运行!),读取配置文件 /tmp/my-crontab.yaml , 如果参数指定的是目录, 那么目录中的 *.yaml 或者 *.yml 文件充当配置 。

基础配置

以下配置每五分钟运行一次命令:

命令可以为字符串或字符串列表。 如果命令是字符串, yacron 会通过shell运行该命令,默认是使用 /bin/sh,上面的例子中使用的是/bin/bash。

如果命令是一个字符串列表,,命令会被直接执行,,而不使用shell。 执行命令的ARGV直接从配置中提取:

schedule选项可以是传统crontab格式的字符串,或者是一个有属性的对象。以下配置每五分钟运行一次,但只在指定的时间2017-07-19运行,且不在其他任何时间运行:

可以自定义命令执行时候的环境变量:

设置默认值

配置文件的default内有个特殊块,cron任务的默认值会继承该特殊块定义的所有属性。尽管 cron任务仍可以根据需要覆盖默认值:

注意:如果配置选项为目录,并且该目录下有多个配置文件,那么每个配置文件中default仅为自己文件内的任务提动默认选项;仅在当前文件内生效。

报告

Yacron内建的报告失败任务方式(以后也许会添加其他方式)是email和sentry。(往下看,更精彩)

在上述例子, onFailure 决定当任务执行失败后所做操作。在这个例子中,我们任务失败后的操作是sentry和发送email。

captureStderr: true 部分指示yacron捕捉程序运行后的标准错误,方便将错误显示在报告中。我们也可以打开captureStdout: true 用来捕捉标准输出。默认情况,yacron仅捕捉标准错误。如果没有启用任务的标准输出或标准错误,那么这些流将简单的写入yacron本身的标准输出和标准错误。

也可以通过 onSuccess 选项来报告任务执行成功或失败。

处理异常

默认情况下,如果过程返回非零代码或生成输出标准错误(已启用标准错误捕捉)yacron 认为任务执行失败。

你可以通过 failsWhen 选项让yacron决定任务执行是否失败。

  • producesStdout
    如果为true,所有捕捉的标准输出都会让yacron认为任务执行失败。默认值为false。
  • producesStderr
    如果为true,所有捕捉的标准错误都会让yacron认为任务执行失败。默认为true。

  • nonzeroReturn
    如果为true,所有任务进程返回非零代码时,yacron认为作业失败。默认为true。

在onFailure 中加入 retry 选项,在任务执行失败的时候,yacron会进行重试失败的作业。

上述设置重试失败任务最多10次,通过指数来进行定义两次重试之间的时间间隔,第一次1秒,每次重试加倍,最大间隔(延迟)为30秒。

当任务执行失败,且重试全部失败后,onPermanentFailure 选项可以定义重试失败后的操作,如发送报告或者,放弃重试。

并发

有时候某个任务执行时间过长,当达到下一个计划执行时,可能之前的任务还未运行完成, concurrencyPolicy 选项可以帮我们解决这一问题。以下是它的三个选项:

  • Allow
    允许并发执行任务(默认为Allow)
  • Forbid
    禁止并发,如果以前的任务未完成,则跳过该任务的下一次运行

  • Replace
    取消未完成的任务,新的任务开始执行,替代原任务

执行超时

(新版本 0.4)

如果你有一个可能挂起的任务,可以通过 executionTimeout 选项来指示yacron,在N秒后结束该进程,尽管它仍在运行。例如,以下cron作业需要2秒才能完成,yacron将在1秒后终止:

当终止任务时,它会让工作过程一段时间后才能正常终止,例如,它可能已经打开了一个文件,即使你告诉它关闭,该进程可能需要几秒钟来刷新缓冲区并避免丢失数据。

另一方面,有时候程序出现异常但仅仅是被卡主,无论怎样都拒绝终止。因此,yacron会检查被要求退出的程序是否已经退出了一段时间。如果没有,将强制杀掉进程。 选项killTimeout选项指示等待进程正常终止的秒数,并强制杀掉它。在unix操作系统中,我们首先发送一个 SIGTERM信号,但是如果进程在 killTimeout秒后没有退出(默认为30),那么发送SIGKILL信号进行清理进程。例如,这个cron任务忽略了SIGTERM,所以yacron会在半秒后发送SIGKILL:

标签:CrontabDocker 发布于:2019-11-15 04:13:52