如何让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)
答案 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和/或价格敏感度不是问题时才有意义。