Так что отправка 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, который ищет старого мастера и убивает его, но это заставляет мое сердце болеть, просто думая об этом.
Должен быть способ!