Поэтому отправка USR2 в Unicorn - это потрясающе - он запускает нового мастера с новой копией вашего кода и автоматически получает любые изменения. Милая. Мой вопрос: как остановить старого мастера? По-видимому, принятый способ находится в файле before_fork:
before_fork do |server,worker|
old_pid = '/var/www/current/tmp/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
Проблема заключается в том, что как только новый мастер (и новые рабочие) порождается, они убивают старого мастера. Поэтому любые запросы на сайт просто сидят там, ожидая, когда новый рабочий начнет работу, обычно в течение нескольких секунд, пока загружается весь столбец Rails.
Если я удалю свой файл before_fork, все будет работать так, как я надеюсь (с точки зрения клиента): я могу перезагрузить мой браузер весь день, и каждый запрос заполняется быстро, нет никаких указаний о том, когда новый хозяин берет верх (кроме видя, что теперь появляются изменения кода). Но, старый мастер теперь висит, пока я вручную не отправлю его QUIT.
Насколько я знаю, нет обратного вызова после того, как работник будет загружен и готов обслуживать клиентов. Это действительно обратный вызов, который я ищу. Я всегда мог создать инициализатор в Rails, который ищет старого хозяина и убивает его, но это заставляет мое сердце болеть, просто думая об этом.
Должен быть способ!