0

Rails プロジェクトを unicorn にデプロイするように切り替えました。私のカピストラーノのレシピdeploy:restart

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

しかし、ときどき、展開手順が成功して終了することがありましたが、unicorn.pid が更新されても、unicorn プロセスは停止したままです。

たとえば、私は 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
4

1 に答える 1

0

なぜそうなのかはわかりませんが、個人的には、Capistrano 経由でデプロイするときに Unicorn PID を強制終了しません。

むしろ、god gem を介して unicorn を起動し、god ファイルを構成して、ファイルが変更されるたびに unicorn を再起動します。

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

このモジュールも .god ファイルに追加する必要があります。

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
于 2013-01-16T02:02:33.773 に答える