“每当”宝石在Heroku上运行cron工作

时间:2011-12-23 19:06:09

标签: ruby-on-rails ruby heroku cron whenever

我创建了一个使用随时随地宝石的应用。宝石创造了cron工作。我让它在本地工作,但似乎无法让它在heroku雪松上工作。执行此操作的命令是什么?

运行:

heroku run whenever --update-crontab job1

不起作用

4 个答案:

答案 0 :(得分:69)

简答:使用调度程序加载项:http://addons.heroku.com/scheduler

答案很长:当你进行heroku运行时,我们

  1. 旋转dyno
  2. 将您的代码放在上面
  3. 执行您的命令,等待它完成
  4. 把dyno扔掉
  5. 您对crontab所做的任何更改都会立即被删除。一切都是短暂的,你不能编辑heroku上的文件,只需推送新代码。

答案 1 :(得分:5)

您需要添加 Heroku Scheduler 插件。

您可以直接从信息中心或使用以下命令添加它:

  1. 安装add-on

    heroku addons:create scheduler:standard
    
  2. lib/tasks

    中创建一个rake任务
    # lib/tasks/scheduler.rake
    task :send_reminders => :environment do
      User.send_reminders
    end
    
  3. 安排工作

    • 访问 Heroku Dashboard
    • 打开 应用
    • add-ons 列表
    • 中选择 计划程序
    • 点击 添加作业 ,输入任务并选择频率。

      e.g。添加 rake send_reminders ,选择 "Daily" "00:00" ,每天午夜发送提醒。

  4. Heroku add cron task

答案 2 :(得分:1)

其他答案指定您应该使用 Heroku Scheduler 插件,它确实能够运行后台任务,但它不支持 cron 的灵活性。

还有一个名为 Cron To Go 的附加组件,它能够利用 cron 的灵活性在一次性 dynos 上运行您的作业。您还可以为您的工作指定时区,并在工作失败、成功或开始时收到通知(电子邮件或网络钩子)。

(完全披露 - 我为创建和运营 Cron To Go 的公司工作)

答案 3 :(得分:0)

如果要:

  • 使用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