自动重新启动我的heroku应用程序

这个terminal命令重新启动我的heroku应用程序:

heroku restart 

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

实际上,我只是为了解决这个问题,然后在上面写了一个贴子,里面有更多的细节。 基本上,你需要heroku-apigem,因为herokugem已经被CLI取代了。 然后你需要一个rake任务,几个configurationvariables和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 

您也可以将其设置为使用您的API令牌,而不是将您的用户名和密码放入configuration中。 如果您不希望您的共同撰稿人/同事知道您的密码或Heroku主帐户的密码,这一点很重要。

 heroku config:set HEROKU_USERNAME=[username] HEROKU_PASSWORD=[password] HEROKU_APP_NAME=[app_name] -a [app_name] 

现在,继续部署和testing:

 git push [heroku_remote_name] [feature_branch]:master heroku run rake heroku:restart -a [app_name] 

最后,我们需要设置任务按计划运行。 我select了免费的Heroku cron插件:

 heroku addons:add scheduler:standard -a [app_name] heroku addons:open scheduler -a [app_name] 

这将在您的浏览器中打开计划程序用户界面,您可以创build一个计划工作人员随时运行rake任务。 我们每天只需要一次,我们select在我们当天的第一个计划任务之前运行它。

我原来的post与frigged CSS(见下面update2):

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看起来像一只狗扔了它。 我很抱歉。

您可以创build一个Heroku cron作业,在您的应用程序中使用Heroku API来重新启动自己…

有一个问题 – 为什么?

一个脚本不是必需的,只是“崩溃”你的应用程序和Heroku将重新启动它。

不要每10分钟更频繁一次,否则Heroku会让你暂停10分钟。

在node.js中,您可以使用process.exit(0)完成此操作。

来自Heroku的Chris支持:

坠毁的测功机将立即重新启动。 如果测功机从坠毁状态转变为“向上”状态(意味着测功机绑定到$ PORT),那么它就是正常运行的测功机。 如果在启动或“启动”序列期间再次崩溃,那么在TIMEOUT时段之后它将不会再次被重新启动。 超时时间目前为10分钟,但可能会有所变化。 这样可以防止在平台上施加外部负载的连续碰撞的dynos。

然而,这听起来不错,实际上并不奏效。 您每次退出时都会遇到超时,因为dyno经理希望您的应用程序能够正常运行:

对于您的员工stream程pipe理而言,您可以干净地退出stream程,但平台期待testing人员能够开始工作。 这听起来就像你基本上是碰撞测功机的结果。

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

您可以通过环境variables“PS”访问dyno的名称(例如“worker.3”,“web.1”),并以编程方式发出一个heroku API重新启动命令。

我们解决了这个问题,通过使用一个buildpack让heroku命令可用于dyno本身,然后使用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` 

然后确保app slug是按照说明重build的:

 git push heroku master 

在Heroku Scheduler中,我们添加了这个小时工作:

 vendor/heroku-toolbelt/bin/heroku ps:restart -a $HEROKU_APP_NAME 

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

启发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 

我用一个非常简单的curl命令脚本解决了这个问题,这个脚本是使用免费的Heroku调度器触发的。

#!/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

据我所知,只需在Heroku Scheduler加载项中运行heroku ps:restart --app APPNAME 。 我不清楚为什么在其他答案中的额外步骤是必要的。