Esto es un truco, pero he creado con éxito un archivo de configuración de unicornio que atrapa la señal TERM
, impidiendo que unicornio lo reciba y realice su apagado rápido. Mi manejador de señal luego envía la señal QUIT
a sí misma para activar el apagado elegante del unicornio.
Probado con Ruby 1.9.2, 4.0.1 y 4.2.1 del unicornio, 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
Una preocupación es que (creo) el manejador de la señal es heredado por los procesos de trabajo. Pero el proceso de trabajo instala su propio controlador TERM
, que debe sobrescribir este, por lo que no esperaría ningún problema. (Ver Unicorn::HttpServer#init_worker_process @ lib/unicorn/http_server.rb:551
Editar:.. Un detalle más, este bloque que se instala el controlador de señal se ejecutará una vez por cada proceso de trabajo (porque before_fork
), pero esto simplemente redundante y no afectará nada
me ascendieron no saben que yo estaba considerando unicornio para un proyecto pero esto me hace. reconsiderar. Aquí están las señales que usa thin: https://github.com/macournoyer/thin/blob/master/lib/thin/server.rb#L211 En ambos casos, QUIT señala un cierre elegante, pero INT y TERM se intercambian. –
Por cierto, aquí hay otro factor: heroku enviará TERM al proceso definido en el archivo de proceso, pero luego ese proceso es responsable de entregar la señal como lo considere oportuno. Entonces, si está ejecutando su servidor detrás de bundle exec, incluso si heroku estaba enviando la señal correcta, vería el comportamiento anterior porque el servidor web no recibe la señal en absoluto. He hablado para apoyarme sobre esto y están buscando una solución. –
Encontré esto hoy, no lo he explorado aún: https://github.com/ddollar/foreman/wiki/Custom-Signals –