我们的客户希望我们每月创建一份报告。
过去,我们使用@monthly cron作业完成此任务。
但这不可靠:
我能做些什么,以确保每月创建报告?
这是一个基于Django的Web应用程序
答案 0 :(得分:6)
使用体面的调度程序
芹菜节拍是一种调度程序;它定期启动任务,然后由集群中的可用工作节点执行。
使用报告功能作业创建定期任务。如果作业失败,芹菜将根据您设置的重试策略重试。
答案 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创建的任务,并且只有在处理所有边缘情况时才会起作用,并且如果你的应用程序出现故障,请务必选择错过的运行等。这将是一个错误处理,状态管理和并发考虑的漏洞。
我建议使用以下两个选项之一:
如果这真的是一次性的工作,前者就是你想要的。如果您有更多这样的任务,那么后者会更好。