我有一个Rails应用程序部署在Heroku上,并且Heroku调度程序可以成功地完成日常工作。
现在我想要一个每周作业,但是调度程序外接程序不允许我选择每周一次。
任何关于我如何做到这一点的建议:
发布于 2013-09-02 03:26:49
仅使用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 发布于 2013-04-17 05:46:57
这并不理想,但我已经开始添加一个RUN_IF环境变量来对通过heroku:scheduler运行的任务进行扫描,它允许我对作业进行每周和每月的日程安排。
# 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任务在没有RUN_IF变量的情况下运行,它将运行。否则,作业将被中止,除非RUN_IF的值为falsey值。
$ 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)类似于上面的其他想法,但我更喜欢将调度细节从应用程序代码中移出。
发布于 2017-01-04 17:55:45
正如到这里来所讨论的,并使用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; fihttps://stackoverflow.com/questions/9835095
复制相似问题