“无论何时” gem 在 Heroku 上运行 cron 作业

Posted

技术标签:

【中文标题】“无论何时” gem 在 Heroku 上运行 cron 作业【英文标题】:"Whenever" gem running cron jobs on Heroku 【发布时间】:2012-01-27 00:45:53 【问题描述】:

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

运行:

heroku run whenever --update-crontab job1

没用

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

对于长时间运行的任务应该怎么做? (需要几个小时才能执行) 这很好,您将在 24 小时内完成它 @Will,但应用程序需要至少每小时生成一次输出,对吧? (“与一次性测功机的连接将在不活动一小时后关闭(在输入和输出中)。) Scheduler docs 声明其“尽力服务”,这意味着无法保证您的任务会运行。如果您需要更可靠的东西 - 就像我的付款处理一样 - 试试clock processes。 那么在 Heroku 上部署 Rails 应用程序时,Heroku 调度程序本质上是否使每当 Gem 变得不必要?尤其是当你有简单的 cron 工作时?我认为使用调度程序会有效地使Whenever gem 无用或者我错过了什么?【参考方案2】:

您需要添加Heroku Scheduler插件。

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

    安装add-on:

    heroku addons:create scheduler:standard
    

    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"每天午夜发送提醒。

【讨论】:

【参考方案3】:

如果你想:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于“无论何时” gem 在 Heroku 上运行 cron 作业的主要内容,如果未能解决你的问题,请参考以下文章

如何停止由“无论何时” gem 创建的 cron 作业

Error-Bundler 找不到 gem“bundle”的兼容版本:在 Heroku 上推送项目时

带有git远程的Gem文件在heroku push上失败

由于 sqlite3 gem 错误,Heroku 部署失败

ruby 在Heroku上使用Rails&searchkick gem安全地使用Amazon Elasticsearch(签名请求)。

asset_sync Gem 导致 Heroku 挂起预编译