自动重启我的heroku应用程序

Ode*_*rth 64 ruby-on-rails heroku

此终端命令重新启动我的heroku应用程序:

heroku restart
Run Code Online (Sandbox Code Playgroud)

有没有办法运行一个脚本来运行此命令并每小时重新启动我的应用程序?

Wat*_*Box 33

我实际上只是为我的应用程序解决了这个问题,并在其上写了一篇文章,其中包含更多细节.基本上,你现在需要heroku-api gem,因为heroku gem被CLI取代了.然后你需要一个rake任务,一些配置变量和heroku调度程序插件(除了最小的dyno时间之外是免费的).

rake任务看起来像这样:

namespace :heroku do
  desc 'restarts all the heroku dynos so we can control when they restart'
  task :restart do
    Heroku::API.
      new(username: ENV['HEROKU_USERNAME'], password: ENV['HEROKU_PASSWORD']).
      post_ps_restart(ENV['HEROKU_APP_NAME'])
  end
end
Run Code Online (Sandbox Code Playgroud)

您也可以将其设置为使用API​​令牌,而不是将您的用户名和密码放入配置中.只有当您不希望您的共同贡献者/同事知道您在Heroku上的主帐户的密码或密码时,这才有意义.

heroku config:set HEROKU_USERNAME=[username] HEROKU_PASSWORD=[password] HEROKU_APP_NAME=[app_name] -a [app_name]
Run Code Online (Sandbox Code Playgroud)

现在,继续部署和测试:

git push [heroku_remote_name] [feature_branch]:master
heroku run rake heroku:restart -a [app_name]
Run Code Online (Sandbox Code Playgroud)

最后,我们需要设置任务以按计划运行.我选择使用免费的Heroku cron附加组件:

heroku addons:add scheduler:standard -a [app_name]
heroku addons:open scheduler -a [app_name]
Run Code Online (Sandbox Code Playgroud)

这将在您的浏览器中打开调度程序UI,您可以创建一个计划的工作程序,以便随时运行rake任务.我们每天只需要一次,我们选择在当天的第一份预定工作之前运行它.

我的原始文章与frigged CSS(见下面的更新2):

https://web.archive.org/web/20150612091315/http://engineering.korrelate.com/2013/08/21/restart-heroku-dynos-on-your-terms/

UPDATE

我将任务的名称从"implode"更改为"restart",以便更清楚地了解正在发生的事情.Implode是一个有趣的名字,但其他方面却毫无用处.

UPDATE2

显然我的公司删除了博客文章.我在这里添加了更多的代码,并且我已经更新了链接,但CSS看起来像一只狗扔了它.我很抱歉.


Joh*_*non 14

您可以创建一个heroku cron作业,在您的应用程序上使用Heroku api重启自己...

但有一个问题 - 为什么?

  • 我的应用程序中有内存泄漏,重新启动应用程序会重置内存使用情况.所以这可能是一个临时修复,直到我们解决内存问题. (10认同)
  • 除了cron附加组件,您可以从本地系统或任何其他服务器(与Internet一起使用)创建一个cron,以便每小时运行"heroku restart". (3认同)

Hen*_*k N 7

我们通过使用buildpack来获取herokudyno本身可用的命令,然后使用Heroku Scheduler 来解决这个问题.

我们按照说明添加了https://github.com/gregburek/heroku-buildpack-toolbelt buildpack:

heroku buildpacks:add?https://github.com/gregburek/heroku-buildpack-toolbelt.git
heroku config:add HEROKU_TOOLBELT_API_EMAIL=`heroku whoami`
heroku config:add HEROKU_TOOLBELT_API_PASSWORD=`heroku auth:token`
Run Code Online (Sandbox Code Playgroud)

然后确保按照说明重建app slug:

git push heroku master
Run Code Online (Sandbox Code Playgroud)

在Heroku Scheduler中,我们将此作为每小时工作添加:

vendor/heroku-toolbelt/bin/heroku ps:restart -a $HEROKU_APP_NAME
Run Code Online (Sandbox Code Playgroud)

您可以通过在Heroku日志中查找Scheduler输出来确定它是否正常工作,当然也可以通过Heroku仪表板中的应用程序的内存图来确定(如果您正在重新启动以解决内存泄漏问题).

  • 我们已经切换到这个未被弃用的 buildpack:https://github.com/heroku/heroku-buildpack-cli 它的配置略有不同。 (2认同)

DrF*_*rts 6

脚本不是必需的,只是"崩溃"您的应用程序,Heroku将重新启动它.

只是不要每隔十分钟更频繁地执行此操作,否则Heroku将使您超时10分钟.

在node.js中,您可以使用process.exit(0).

来自Chris at Heroku支持:

坠毁的dyno将立即重新启动.如果dyno从崩溃状态变为"向上"状态(意味着dyno绑定到$ PORT),那么它将成为正常运行的dyno.如果它在引导或"启动"序列期间再次崩溃,则在TIMEOUT时段之后它将不会再次重新启动.TIMEOUT期限目前为10分钟,但可能会有所变化.这可以防止持续崩溃的dynos在平台上放置无关的负载.

然而,听起来不错,它在实践中不起作用.每次退出时都会达到超时,因为dyno管理器希望你的应用程序启动:

对于您的工作流程管理,您可以干净地退出流程,但平台期望dyno能够正常运行.听起来你本质上是撞毁了dyno.

因此,如果您需要定期重新启动 - 并且该时间段可以设置为> 10分钟 - 这是管理内存清除的简单方法.如果需要动态重新启动(例如,检测到空闲时)或经常需要探索其他选项.

您可以通过环境变量"PS"访问dyno的名称(例如"worker.3","web.1"),并以编程方式发出heroku API restart命令.

  • 对于某些人来说这是必要的,在我们的例子中,我们的应用程序需要80秒才能在heroku上启动,当他们执行自动每日dyno cylces时,会导致用户出现超时错误.如果我们进行heroku重启,它会使用预启动,并且dynos在获得流量之前就已启动. (3认同)

gro*_*ser 5

灵感来自https://www.stormconsultancy.co.uk/blog/development/ruby-on-rails/automatically-restart-struggling-heroku-dynos-using-logentries/

# Setup
heroku plugins:install https://github.com/heroku/heroku-oauth
heroku authorizations:create -s write
heroku config:add RESTART_API_KEY=<API KEY>
heroku config:add APP_NAME=<App Name>

heroku addons:add scheduler:standard -a <App Name>
heroku addons:open scheduler -a <App Name>
add `rake restart`

# Gemfile
gem 'platform-api', require: false

# Rakefile
task :restart do
  require 'platform-api'
  app_name = ENV.fetch('APP_NAME')
  key = ENV.fetch('RESTART_API_KEY')
  connection = PlatformAPI.connect_oauth(key)
  connection.dyno.list(app_name).map do |info|
    if info['type'] == 'web' && info['state'] == 'up'
      puts "Restarting #{info.inspect}"
      connection.dyno.restart(app_name, info['name'])
    else
      puts "Skipping #{info.inspect}"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 今天仍在使用它,所以是的:) (2认同)
  • 我可以确认它按预期运行。&lt;3 (2认同)

Mat*_*dan 5

我在 repo 中使用一个非常简单的 curl 命令脚本解决了这个问题,该脚本使用免费的 Heroku scheduler触发。

#!/bin/sh curl -X DELETE "https://api.heroku.com/apps/${HEROKU_APP_NAME}/dynos" \ --user "${HEROKU_CLI_USER}:${HEROKU_CLI_TOKEN}" \ -H "Content-Type: application/json" \ -H "Accept: application/vnd.heroku+json; version=3"

https://gist.github.com/mattheworiordan/f052b7693aacd025f025537418fa5708