49

我创建了一个使用when gem 的应用程序。gem 创建 cron 作业。我让它在本地工作,但似乎无法让它在 heroku cedar 上工作。执行此操作的命令是什么?

跑步:

heroku run whenever --update-crontab job1

不工作

4

4 回答 4

79

简短回答:使用调度程序插件:http ://addons.heroku.com/scheduler

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

  1. 旋转测功机
  2. 把你的代码放在上面
  3. 执行你的命令,等待它完成
  4. 扔掉测功机

您对 crontab 所做的任何更改都会立即被丢弃。一切都是短暂的,您无法在 heroku 上编辑文件,只需推送新代码。

于 2011-12-23T19:16:47.823 回答
13

您需要添加Heroku Scheduler插件。

您可以直接从仪表板添加它或使用以下命令:

  1. 安装add-on

    heroku addons:create scheduler:standard
    
  2. 在中创建一个 rake 任务lib/tasks

    # lib/tasks/scheduler.rake
    task :send_reminders => :environment do
      User.send_reminders
    end
    
  3. 安排工作

    • 访问Heroku 仪表板
    • 打开你的应用
    • 从列表中选择调度程序add-ons
    • 点击Add Job,输入任务并选择频率。

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

Heroku 添加 cron 任务

于 2016-09-28T09:44:41.543 回答
2

如果你想:

  • 采用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
于 2020-10-07T18:10:57.237 回答
2

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

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

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

于 2021-05-10T06:34:48.797 回答