Это хак, но я успешно создал файл конфигурации единорога, который перехватывает сигнал TERM
, предотвращая его получение и быстрое отключение. Мой обработчик сигнала затем посылает сигнал QUIT
обратно самому себе, чтобы инициировать изящное отключение единорога.
Протестировано с Ruby 1.9.2, Unicorn 4.0.1 и 4.2.1, Mac OS X.
listen 9292
worker_processes 1
# This is a hack. The code is run with 'before_fork' so it runs
# *after* Unicorn installs its own TERM signal handler (which makes
# this highly dependent on the Unicorn implementation details).
#
# We install our own signal handler for TERM and simply re-send a QUIT
# signal to our self.
before_fork do |_server, _worker|
Signal.trap 'TERM' do
puts 'intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
end
Одна проблема заключается в том, что (я считаю) этот обработчик сигналов наследуется рабочими процессами. Но рабочий процесс устанавливает собственный обработчик TERM
, который должен перезаписать этот, так что я не ожидаю каких-либо проблем. (См. Unicorn::HttpServer#init_worker_process @ lib/unicorn/http_server.rb:551
.
Редактировать: еще одна деталь, этот блок, который устанавливает обработчик сигналов, будет запускаться один раз для каждого рабочего процесса (потому что before_fork
), но это просто избыточно и ни на что не повлияет.