“每当”gem在Heroku上运行cron作业时

6tqwzwtp  于 2022-11-13  发布在  其他
关注(0)|答案(5)|浏览(144)

我创建了一个应用程序,它使用了whenever gem。gem创建了cron作业。我让它在本地运行,但似乎不能让它在heroku cedar上运行。执行此操作的命令是什么?
跑步:

heroku run whenever --update-crontab job1

不起作用

tcomlyy6

tcomlyy61#

简短回答:使用预设程序加载项:http://addons.heroku.com/scheduler
长答:当你做Heroku运行时,我们
1.使测力计转动
1.把你的代码放在上面
1.执行命令,等待其完成
1.把测力计扔掉
你对crontab所做的任何修改都会立即被丢弃。一切都是短暂的,你不能在heroku上编辑文件,只需推送新代码。

3phpmpom

3phpmpom2#

您需要添加**Heroku Scheduler**加载项。
您可以直接从 Jmeter 板或使用以下命令添加它:
1.安装add-on

heroku addons:create scheduler:standard

1.在lib/tasks中创建rake任务

# lib/tasks/scheduler.rake
task :send_reminders => :environment do
  User.send_reminders
end
  • 计划作业
  • 请访问**Heroku Dashboard**
  • 打开您的***应用程序***
  • 从**add-ons列表中选择调度程序**
  • 点击***添加作业***,输入任务并选择频率。

例如,添加**rake send_reminders,选择"Daily""00:00"**在每天午夜发送提醒。

y3bcpkx1

y3bcpkx13#

其他的答案则指出您应该使用Heroku Scheduler附加组件,它确实能够运行后台任务,但它不支持cron的灵活性。
还有另一个插件,叫做Cron To Go,它能够在一次性dynos上运行你的作业,具有cron的灵活性。你也可以为你的作业指定一个时区,并在作业失败、成功或启动时收到通知(电子邮件或webhook)。
(Full披露-我为创建和运营Cron To Go的公司工作)

umuewwlo

umuewwlo4#

如果您想:

  • 使用Heroku Scheduler
  • 每分钟运行一次任务(而不是10分钟)
  • 不在乎测功器工作时间

这是我的解决方案黑客运行作业每分钟-假设任务在60秒内完成。

task start_my_service: :environment do
  1.upto(9) do |iteration|
    start_time = DateTime.now
    Services::MyService.call
    end_time = DateTime.now
    wait_time = 60 - ((end_time - start_time) * 24 * 60 * 60).to_i
    sleep wait_time if wait_time > 0
  end
end
ut6juiuv

ut6juiuv5#

Heroku不支持cron作业。Heroku调度程序有两个缺点:

  • 您不能选择运行作业的任意间隔或时间(可以是每10分钟、1小时或每天)。
  • 您的作业不是在代码中定义的,因此不在您的版本控制系统中,并且不容易跟踪或修改。

Heroku确实提供了一个替代方案:custom clock processes。但是时钟进程需要其自己的dyno,并且“由于dyno每天至少重新启动一次,因此在时钟进程启动时将需要存在一些逻辑,以确保在dyno重新启动期间不跳过作业间隔”。
Simple scheduler是专门为Heroku上的日程安排而制作的宝石,但似乎有点陈腐。
我最终使用了sidekiq-cron。唯一的缺点:如果sidekiq正好在计划运行某个作业时关闭,则该作业将不会运行。

相关问题