我在Heroku上部署了一个Rails应用,并成功使用Heroku Scheduler添加了每日作业。
现在我想要一个每周作业,但是调度程序附加组件不允许我选择每周选项。
您有什么建议可以实现这一点:
- 我曾经尝试过使用rufus-scheduler,但它给我带来了一些问题,所以这不是一个选择。详见这里。
- 我正在考虑检查每日工作中的当前日期。是否有人尝试过并提供反馈或知道该方法的问题?
- 非常感谢其他的想法。
我在Heroku上部署了一个Rails应用,并成功使用Heroku Scheduler添加了每日作业。
现在我想要一个每周作业,但是调度程序附加组件不允许我选择每周选项。
您有什么建议可以实现这一点:
有一个方法可以用你提到的第二个小点:
启用Heroku cron插件,然后在app/lib/tasks
中添加一个cron.rake
任务
启用Heroku scheduler插件,然后在app/lib/tasks
中添加一个scheduler.rake
任务
task :your_weekly_task=> :environment do
if Time.now.friday? # previous answer: Date.today.wday == 5
#do something
end
end
你甚至可以豪华地定义你希望任务运行的日期; o) (5代表星期五)
编辑:顺便说一下,Cron已经被弃用了,Heroku建议转换到他们的计划程序添加。但是这并不改变每周作业的方法。
编辑2:根据sunkencity的反馈对我的答案进行调整。
一种仅使用Shell代码的备选方案。将Heroku调度程序设置为每小时运行,并对其进行与date命令的比较:
# setting the schedular to run hourly at *:30 is equivalent to the
# crondate: 30 8 * * 1
if [ "$(date +%H)" = 08 ] && [ "$(date +%d)" = 01 ]; then YOUR_COMMAND ; fi
我已经使用这段代码来模拟本地时区的cron:
nz_hour="$(TZ=NZ date +%H)" ; nz_day="$(TZ=NZ date +%d)" ; if [ "$nz_hour" = 08 ] && [ "$nz_day" = 01 ]; then YOUR_COMMAND ; fi
虽然不是最理想的,但我已经开始通过添加一个RUN_IF环境变量到通过heroku:scheduler运行的rake任务来实现对作业进行每周和每月的调度。
# lib/tasks/scheduler.rake
def run?
eval ENV.fetch('RUN_IF', 'true')
end
def scheduled
if run?
yield
else
puts "RUN_IF #{ENV['RUN_IF'].inspect} eval'd to false: aborting job."
end
end
# lib/tasks/job.rake
task :job do
scheduled do
# ...
end
end
$ rake job # => runs always
$ rake job RUN_IF='Date.today.monday?' # => only runs on Mondays
$ rake job RUN_IF='Date.today.day == 1' # => only runs on the 1st of the month
$ rake job RUN_IF='false' # => never runs (not practical, just demonstration)
与上面的其他想法类似,但我更喜欢将调度细节从应用程序代码中移出。
如此处所讨论,并使用Rob提供的逻辑,以下是按星期、每月一次和特定日期分解的bash脚本。
每周一运行任务:
if [ "$(date +%u)" = 1 ]; then MY_COMMAND; fi
if [ "$(date +%d)" = 01 ]; then MY_COMMAND; fi
您也可以在每年的12月24日运行作业:
if [ "$(date +%m)" = 12 ] && [ "$(date +%d)" = 24 ]; then MY_COMMAND; fi
#!/bin/bash
cmd="echo your schedule job here"
# Only run on even days
ruby -e 'if Time.now.utc.day.even?; puts "Not today!"; exit 1; end' && $cmd "$@"
这适用于非 Ruby 项目(例如我的情况:Clojure)。