2012-12-15 76 views
0

我刚刚切换到在独角兽上部署我的Rails项目。在我Capistrano的配方deploy:restart为什么unicorn.pid被更新,但进程不会重新启动?

task :restart, :except => { :no_release => true } do 
    run "cd #{shared_path}/pids && kill -s USR2 `cat unicorn.pid`" 
end 

但是从我不时发现,有时候,部署过程成功完成,不过虽然unicorn.pid更新,麒麟过程保持静止。

例如,我部署在12月15日,并且监测到unicorn.pid已更新,但是如果我运行ps -ef | grep unicorn,我可以看到独角兽进程仍在我上次部署时启动,所以它指的是最后一个发布文件夹造成麻烦。

这是为什么?

以下是我的unicorn.rb文件:

env = ENV["RAILS_ENV"] 

case env 
when 'pre', 'production' 
    @app_path = '/home/deployer/deploy/myproject' 
end 

if env == 'pre' || env == 'production' 
    user 'deployer', 'staff' 
    shared_path = "#{@app_path}/shared" 
    stderr_path "#{shared_path}/log/unicorn.stderr.log" 
    stdout_path "#{shared_path}/log/unicorn.stdout.log" 

    if env == 'production' 
    worker_processes 6 
    else 
    worker_processes 2 
    end 

    working_directory "#{@app_path}/current" # available in 0.94.0+ 

    listen "/tmp/myproject.sock", :backlog => 64 


    timeout 30 

    pid "#{shared_path}/pids/unicorn.pid" 


    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 = "#{shared_path}/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 
end 

回答

0

我不知道为什么是这样的情况,但个人通过Capistrano的部署时,我不杀麒麟PID。

相反,我通过god gem启动独角兽,并配置god文件,以便在文件被触摸时重新启动独角兽。

当我通过Capistrano的部署,我再轻触文件中的每个部署后,迫使麒麟进程重新启动

namespace :deploy do 
    desc "Touch restart.txt, which will restart all God processes" 
    task :restart do 
    run "touch #{ current_path }/tmp/restart.txt" 
end 

您需要将此模块添加到文件。上帝太:

module God 
    module Conditions 
    class RestartFileTouched < PollCondition 
     attr_accessor :restart_file 
     def initialize 
     super 
     end 

     def process_start_time 
     Time.parse(`ps -o lstart -p #{self.watch.pid}`) 
     end 

     def restart_file_modification_time 
     File.mtime(self.restart_file) 
     end 

     def valid? 
     valid = true 
     valid &= complain("Attribute 'restart_file' must be specified", self) if self.restart_file.nil? 
     valid 
     end 

     def test 
     process_start_time < restart_file_modification_time 
     end 
    end 
    end 
end 
+0

感谢Hisoka,所以这样上帝照顾所有人,我仍然得到独角兽pre_load应用程序的好处? – larryzhao

+0

是的,基本上就是这样。 –

相关问题