每周Heroku调度程序?

时间:2014-03-10 23:56:16

标签: ruby-on-rails ruby-on-rails-3 heroku ruby-on-rails-4

如何让heroku调度程序每周运行一次?

这是否可行,从我所看到的情况来看,我只能按小时,每10分钟或每日任务安排,而且每周都没有选择。

如果没有,那么其他Heroku附加组件可能允许我在每周生产的bassis上运行作业(即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)

4 个答案:

答案 0 :(得分:8)

我找到了一个很好的答案here。只需在Heroku Scheduler中使用bash脚本,该脚本在运行命令之前检查星期几:

if [ "$(date +%u)" = 1 ]; then MY_COMMAND; fi   # only run on Mondays

答案 1 :(得分:6)

设置每日工作,并在工作中检查星期几是星期日(或任何一天)。如果是那天,请运行该作业。如果不是那一天,什么也不做,退出。

编辑:我在想更像

require 'date'
task :weeklydelete do
  if Date.today.wday.zero?
    runner "Event.clear_expired"
    runner "Activity.clear_expired"
  end
end

记录到一个文件的东西不会在heroku上工作,我不确定你用的是什么时间的东西,但我担心如果调度程序运行它不完全是3,那东西可能不起作用。

答案 2 :(得分:4)

Date类有一些非常棒的帮助器方法。因此,Date.today.wday.zero?可以缩短为Date.today.sunday?

答案 3 :(得分:0)

上面提到的关于运行日常工作的想法,但如果一周中的某一天不是您希望工作运行的那一天,那么让它退出而不运行是一个很好的解决方案。但是,如果您有一个运行Sidekiq或DelayedJob的工作器dyno(或任何其他允许预定作业的排队方案),那么还有另一个解决方案,即使用直到当天不运行的作业为作业队列设定种子你需要的一周。

这种方法比检查一周中的特定日子更清洁,但只有在您已经使用至少一个后台工作人员dyno和/或价格敏感度不是问题时才有意义。