2012-06-25 78 views
2

我有一個似乎工作正常的capistrano部署,但是在將USR2信號發送到獨角獸進程後,它會在舊版本文件夾中重新啓動。這有點類似問題就在這裏:獨角獸在舊版本目錄中重新啓動

Restarting Unicorn with USR2 doesn't seem to reload production.rb settings

但是,我working_directory的被設置爲一個字符串,我沒有做任何幻想吧。

我生產麒麟配置:

worker_processes 4 
working_directory "/u/apps/dragonfly-application/current" # available in 0.94.0+ 
listen "/tmp/.sock", :backlog => 64 
timeout 30 
pid "/u/apps/dragonfly-application/shared/pids/unicorn.pid" 
stderr_path "/u/apps/dragonfly-application/shared/log/unicorn.stderr.log" 
stdout_path "/u/apps/dragonfly-application/shared/log/unicorn.stdout.log" 

preload_app true 
GC.respond_to?(:copy_on_write_friendly=) and 
    GC.copy_on_write_friendly = true 

before_fork do |server, worker| 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 

    old_pid = '/u/apps/dragonfly-application/shared/pids/unicorn.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| 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

而且我Capistrano的部署:

set :application, "dragonfly-application" 
set :repository, "[email protected]:Rodeoclash/Nile.git" 
set :scm, :git 
set :user, "user" 
set :rvm_ruby_string, "1[email protected]" 
set :bundle_flags, "--deployment --binstubs" 

server "202.2.94.221", :app, :web, :db, :primary => true 

before 'deploy:setup', 'rvm:install_rvm' 
before 'deploy:setup', 'rvm:install_ruby' 

after "deploy:finalize_update", "db:config" 
after "deploy:restart", "deploy:cleanup" # clean up old releases on each deploy 
after "deploy", "deploy:migrate" 
after 'deploy:update_code', 'symlink_uploads' 

load 'deploy/assets' 

namespace :db do 

    # copy database.yml into location 
    task :config, :except => { :no_release => true }, :role => :app do 
    run "cp -f #{shared_path}/config/database.yml #{release_path}/config/database.yml" 
    end 

    desc "reload the database with seed data" 
    task :seed do 
    run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}" 
    end 

end 

task :symlink_uploads do 
    run "ln -nfs #{shared_path}/uploads #{release_path}/public/uploads" 
end 

require "bundler/capistrano" 
require 'capistrano-unicorn' 
require "rvm/capistrano" 

我出的在哪裏看的想法。如果服務器完全停止,然後重新啓動,它將使用正確的文件夾,但使用USR2信號時,它不會在符號鏈接中使用正確的路徑。這就好像它在加載配置時解析符號鏈接並且在代碼重新啓動之前不再解析它。

我正在使用RVM。

回答

6

在引起符號鏈接解決的Rake任務之一中引用了「Rails.root」。將其替換爲對共享目錄的硬編碼引用,並且工作正常。

+0

考慮選擇這個答案,以便它出現在已解決的類別中! – WedTM