ruby-on-rails – Unicorn PID在初始部署时过时了
我试图在我的rails应用程序中第一次使用capistrano和unicorn.我可以成功部署,除了unicorn不会从stderr的以下错误开始:
I,[2013-03-25T16:55:35.877323 #2378] INFO -- : reloading config_file=/var/www/good/current/config/unicorn.rb E,[2013-03-25T16:55:35.881496 #2378] ERROR -- : error reloading config_file=/var/www/good/current/config/unicorn.rb: Already running on PID:2378 (or pid=/var/www/good/current/tmp/pids/unicorn.pid is stale) (ArgumentError) E,[2013-03-25T16:55:35.881548 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:193:in `pid=' E,[2013-03-25T16:55:35.881579 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/lib/unicorn/configurator.rb:111:in `block in commit!' E,[2013-03-25T16:55:35.881606 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/lib/unicorn/configurator.rb:108:in `each' E,[2013-03-25T16:55:35.881645 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/lib/unicorn/configurator.rb:108:in `commit!' E,[2013-03-25T16:55:35.881674 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:699:in `load_config!' E,[2013-03-25T16:55:35.881703 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/lib/unicorn/http_server.rb:308:in `join' E,[2013-03-25T16:55:35.881731 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/gems/unicorn-4.6.2/bin/unicorn:126:in `<top (required)>' E,[2013-03-25T16:55:35.881758 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `load' E,[2013-03-25T16:55:35.881786 #2378] ERROR -- : /var/www/good/shared/bundle/ruby/1.9.1/bin/unicorn:23:in `<main>' I,[2013-03-25T16:55:36.233632 #2378] INFO -- : reaped #<Process::Status: pid 2392 exit 0> worker=1 I,[2013-03-25T16:55:36.234045 #2378] INFO -- : reaped #<Process::Status: pid 2397 exit 0> worker=3 I,[2013-03-25T16:55:36.234560 #2378] INFO -- : reaped #<Process::Status: pid 2394 exit 0> worker=2 I,[2013-03-25T16:55:36.336246 #8587] INFO -- : executing ["/var/www/good/shared/bundle/ruby/1.9.1/bin/unicorn","-c","/var/www/good/current/config/unicorn.rb","-E","production","-D",{12=>#<Kgio::UNIXServer:fd 12>,13=>#<Kgio::TCPServer:fd 13>}] (in /var/www/good/releases/20130325165445) I,[2013-03-25T16:55:36.336510 #8587] INFO -- : forked child re-executing... I,[2013-03-25T16:55:38.475972 #2378] INFO -- : reaped #<Process::Status: pid 2389 exit 0> worker=0 I,[2013-03-25T16:55:38.476109 #2378] INFO -- : master complete 关键是
我已经包含了Gemfile,deploy.rb和unicorn.rb 我很感激任何帮助或想法.我也在使用RVM和ubuntu 配置/ deploy.rb require "rvm/capistrano" set :rvm_type,:system set :rvm_install_with_sudo,true require "bundler/capistrano" set :bundle_without,[:darwin,:development,:test] set :application,"Talking GOOD" set :repository,"git@github.com:FTW-Development/good.git" set :scm_user,"hunter@ftwdev.com" ssh_options[:forward_agent] = true #set :migrate_target,:current #set :ssh_options,{ :forward_agent => true } #set :rails_env,"production" set :deploy_to,"/var/www/good" #set :normalize_asset_timestamps,false #what? set :user,"rails" set :group,"www" set :use_sudo,false set :keep_releases,5 after "deploy:restart","deploy:cleanup" require 'capistrano-unicorn' #after 'deploy:restart','unicorn:reload' # app IS NOT preloaded after 'deploy:restart','unicorn:restart' # app preloaded #role :web,"your web-server here" # Your HTTP server,Apache/etc #role :app,"your app-server here" # This may be the same as your `Web` server #role :db,"your primary db-server here",:primary => true # This is where Rails migrations will run #role :db,"your slave db-server here" #set :stages,%(production,staging) #set :default_stage,"staging" #require 'capistrano/ext/multistage' #set(:unicorn_env) { rails_env } #set(:app_env) { rails_env } #role(:web) { domain } #role(:app) { domain } #role(:db,:primary => true) { domain } #set(:deploy_to) { "/home/#{user}/#{application}/#{fetch :app_env}" } #set(:current_path) { File.join(deploy_to,current_dir) } server "good.ftwdev.com",:app,:web,:db,:primary => true 配置/ unicorn.rb app_path = "/var/www/good/current" # Set unicorn options worker_processes 1 preload_app true timeout 180 listen "127.0.0.1:9000" # Spawn unicorn master worker for user apps (group: apps) user 'rails.www' # Fill path to your app working_directory "/var/www/good/current" # Should be 'production' by default,otherwise use other env rails_env = ENV['RAILS_ENV'] || 'production' # Log everything to one file stderr_path "log/unicorn.log" stdout_path "log/unicorn.log" # Set master PID location pid "#{app_path}/tmp/pids/unicorn.pid" before_fork do |server,worker| ActiveRecord::Base.connection.disconnect! old_pid = "#{server.config[:pid]}.oldbin" if File.exists?(old_pid) && server.pid != old_pid begin Process.kill("QUIT",File.read(old_pid).to_i) rescue Errno::ENOENT,Errno::ESRCH # someone else did our job for us end end end after_fork do |server,worker| ActiveRecord::Base.establish_connection end 的Gemfile source 'https://rubygems.org' gem 'rails','3.2.8' # Bundle edge Rails instead: # gem 'rails',:git => 'git://github.com/rails/rails.git' gem 'mysql2' gem 'devise','~> 2.1.0' gem 'cancan' # Gems used only for assets and not required # in production environments by default. group :assets do gem 'sass-rails','~> 3.2.3' gem 'coffee-rails','~> 3.2.1' gem 'bootstrap-sass','~> 2.2.2.0' # See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer',:platforms => :ruby gem 'uglifier','>= 1.0.3' end gem 'jquery-rails' gem 'haml' gem 'hpricot' gem 'ruby_parser' gem 'simple_form' gem 'high_voltage' gem 'paperclip','~> 3.0' gem 'twitter-bootstrap-rails' group :production do gem 'rb-inotify','~> 0.9' gem 'execjs' gem 'therubyracer' gem 'unicorn','~> 4.6' end group :development do gem 'thin' gem 'growl' gem 'guard' gem 'guard-bundler' gem 'guard-livereload' gem 'guard-rails' gem 'guard-rspec' gem 'rack-livereload' gem 'html2haml' gem 'capistrano' gem 'capistrano-unicorn' gem 'rvm-capistrano' gem 'rb-fsevent',:require => false gem 'rb-inotify','~> 0.9',:require => false gem 'rb-fchange',:require => false end #gem "rspec-rails",">= 2.12.1",:group => [:development,:test] #gem "database_cleaner",">= 0.9.1",:group => :test #gem "email_spec",">= 1.4.0",:group => :test #gem "cucumber-rails",">= 1.3.0",:group => :test,:require => false #gem "launchy",">= 2.1.2",:group => :test #gem "capybara",">= 2.0.2",:group => :test #gem "factory_girl_rails",">= 4.1.0",:test] #gem "bootstrap-sass",">= 2.1.1.0" #gem "devise",">= 2.2.0" #gem "cancan",">= 1.6.8" #gem "rolify",">= 3.2.0" #gem "simple_form",">= 2.0.4" #gem "quiet_assets",">= 1.0.1",:group => :development #gem "figaro",">= 0.5.2" #used for configurations #gem "better_errors",">= 0.2.0",:group => :development #gem "binding_of_caller",">= 0.6.8",:group => :development # To use ActiveModel has_secure_password # gem 'bcrypt-ruby','~> 3.0.0' # To use Jbuilder templates for JSON # gem 'jbuilder' # Use unicorn as the app server # gem 'unicorn' # Deploy with Capistrano # gem 'capistrano' # To use debugger # gem 'debugger' 解决方法
你的问题是当你正在部署时,你不可能在再次运行独角兽之前杀死独角兽大师的pid.我认为问题在于你的capistrano食谱……
使用独角兽时,我们通常会在启动服务器时将pid保存在生产环境中的共享文件夹中,您还可以保存日志,上传和其他独立于每个环境的sfuff. 看看我的deploy.rb之一的这两个任务: desc "Start unicorn" task :start,:except => { :no_release => true } do run "cd #{current_path} ; bundle exec unicorn_rails -c config/unicorn.rb -D" run "ps aux | grep unicorn_rails | head -n 1 | awk '{print $2}' > #{deploy_to}/shared/tmp/pids/unicorn.pid" end desc "Stop unicorn" task :stop,:except => { :no_release => true } do run "kill -s QUIT `cat #{deploy_to}/shared/tmp/pids/unicorn.pid`" end 因此,当我停止独角兽时,我总是杀死共享文件夹中的主pid,当我启动它时,我将此pid的副本复制到生产项目中的共享文件夹. 如果想尝试一下,以下链接的配方零停机时间: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |