自动重新启动我的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):
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仪表板中的应用程序的内存图(如果要重新启动以解决内存泄漏)来确定它是否正常工作。
# 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
。 我不清楚为什么在其他答案中的额外步骤是必要的。