@monthly cron的工作不可靠

时间:2017-11-10 09:51:57

标签: python django cron

我们的客户希望我们每月创建一份报告。

过去,我们使用@monthly cron作业完成此任务。

但这不可靠:

  1. 服务器可能会在这一分钟内关闭。 Cron没有重新开始这些工作
  2. 如果服务器已启动,则此时可能无法访问数据库。
  3. 如果服务器已启动且数据库已启动,则可能存在无法访问的第三方系统
  4. 可能存在软件错误。
  5. 我能做些什么,以确保每月创建报告?

    这是一个基于Django的Web应用程序

5 个答案:

答案 0 :(得分:6)

使用体面的调度程序

  芹菜节拍是一种调度程序;它定期启动任务,然后由集群中的可用工作节点执行。

使用报告功能作业创建定期任务。如果作业失败,芹菜将根据您设置的重试策略重试。

Celery doc - Periodic Tasks

答案 1 :(得分:1)

移动件太多,因此需要考虑的选项。但问题1意味着您需要某种形式的外部方式来跟踪成功(否则一个选项可能是您的服务器任务 - 比如一个bash脚本 - 继续重试N次并在重试之间休眠,直到报告生成成功)。

如果您想要一个完整的解决方案,您可以将其用于许多不同的未来需求,您可以查看可用的第三方调度程序,如Jenkins或SOS Berlin。

如果您正在寻找一个更简单的解决方案,您可以通过cron安排报告脚本多次运行(比如月末的每小时一天),然后让它跟踪报告是否是生成并成功发送(这可能就像创建文件并检查其存在或将值写入数据库一样简单。)

答案 2 :(得分:1)

您应该编写一些脚本来测试条件并执行所有必需的操作。

if is_work_finished_less_then_month_ago():
    return
else:
    try:
        generate_normal_report()
    except some_error as e:
        report_about_error(e)

然后每小时或每天运行一次。

如果你害怕有太多的error_reports,那就用report_about_error()方法做同样的事情:检查你上次发送报告的时间,如果经常发生则不要发送报告。

答案 3 :(得分:1)

简单的方法是,您可以编写一个帮助程序,以便脚本首先检查报告的可用性,并仅在报告不可用时生成报告。

然后安排脚本在每月的那一天每小时运行一次。

按如下方式更改脚本:

if [[ -f <report_name> ]]
then
    echo "report exists" 
    exit 1
else
    echo "run generate report script"

crontab条目(每个月28日每小时运行一次):

0 0-23 28 * * <name_of_helper_script>

答案 4 :(得分:1)

cron无法满足您的要求。通过Django应用程序启动类似cron的任务并不是Django创建的任务,并且只有在处理所有边缘情况时才会起作用,并且如果你的应用程序出现故障,请务必选择错过的运行等。这将是一个错误处理,状态管理和并发考虑的漏洞。

我建议使用以下两个选项之一:

  • 无论如何都要用cron开始工作,但写一个Nagios检查以确保如果由于某种原因没有生成报告(并手动处理这些罕见的情况),你会收到通知。
  • 使用Airflow或专门为处理计划任务的计划,监控,重试和记录而创建的任何其他框架。

如果这真的是一次性的工作,前者就是你想要的。如果您有更多这样的任务,那么后者会更好。