如何使heroku调度器每周运行一次?
这可能吗?从我所看到的,我只能安排每小时、每10分钟或每天的任务,而不能安排每周的任务。
如果没有,还有什么其他的Heroku add -on可以让我在生产环境中每周运行一次作业(即cron作业)任务?
谢谢!
更新2: require 'date'
task :weeklydelete do
if Date.today.wday.zero?
runner "Event.clear_expired"
runner "Activity.clear_expired"
end
end
更新2.5:$heroku run bundle exec rake weeklydelete -a friendiosenew
Running `bundle exec rake weeklydelete` attached to terminal... up, run.6194
rake aborted!
undefined local variable or method `path' for main:Object
/app/lib/tasks/weeklydelete.rake:2:in `block in <top (required)>'
Tasks: TOP => weeklydelete
(See full trace by running task with --trace)
我在这里找到了一个很好的答案。只需在Heroku Scheduler中使用一个bash脚本,在运行命令之前检查一周中的日期:
if [ "$(date +%u)" = 1 ]; then MY_COMMAND; fi # only run on Mondays
设置每日作业,并在作业中检查一周中的哪一天是星期日(或任意一天)。如果是那天,运行任务。如果不是那天,什么都不做,然后退出。
编辑:我想更像
require 'date'
task :weeklydelete do
if Date.today.wday.zero?
runner "Event.clear_expired"
runner "Activity.clear_expired"
end
end
日志到文件的东西不会在heroku上工作,我不确定你使用什么时间的东西,但我担心如果调度程序运行它不是在3,那东西可能无法工作。
Date类有一些非常棒的辅助方法。因此,Date.today.wday.zero?
可以缩写为Date.today.sunday?
上面关于运行每日作业的想法,但是如果一周中的某一天不是您想要运行的作业,则让它在不运行的情况下退出,这是一个很好的解决方案。但是,如果您有一个运行Sidekiq或DelayedJob(或任何其他允许计划作业的队列方案)的工作动态,那么还有另一种解决方案,即在作业队列中播种作业,这些作业直到您需要的那一天才会运行。
这种方法比检查一周中特定的一天要干净一些,但是只有在您已经使用了至少一个后台worker动态并且/或者价格敏感性不是问题时,它才有意义。