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。
考慮選擇這個答案,以便它出現在已解決的類別中! – WedTM