task :restart_unicorn, :except => { :no_release => true } do
run "#{try_sudo} kill -s USR2 $(cat /var/www/app_name/shared/pids/unicorn.pid)"
end
Quando faccio sudo kill -s USR2 $(cat /var/www/app_name/shared/pids/unicorn.pid)
sul server, ciò che accade è che un nuovo padrone unicorno è stato creato, e quello vecchio ha (old)
aggiunto al suo nome. Il vecchio non viene mai ucciso, ma anche se lo uccido da solo, la nuova istanza di unicorno mostra ancora il vecchio codice prima della distribuzione. La nuova istanza ha lo stesso tempo di creazione del vecchio - è come se fosse appena stata duplicata. Se interrompo l'istanza e la riavvio, funziona, ma mi piacerebbe essere in grado di eseguire distribuzioni zero-downtime.Unicorn continua a utilizzare il vecchio codice seguente distribuire + riavvio
Qualsiasi aiuto è apprezzato.
EDIT
Dopo aver seguito la sugest Ilya O., ho creato un compito Capistrano che fa questo:
old_pid = get_pid('/var/www/appname/shared/pids/unicorn.pid')
run "#{try_sudo} kill -s SIGUSR2 $(cat /var/www/appname/shared/pids/unicorn.pid)"
/var/www/app/current/tmp/pids/unicorn.pid)"
run "#{try_sudo} kill -s SIGWINCH #{old_pid}"
Questo viene eseguito SIGUSR2 sul pid, e uccide il vecchio processo unicorno. Il problema è che tutto il mio server delle applicazioni non viene mai aggiornato al mio codice distribuito di recente, questa attività sembra solo copiare il mio vecchio ambiente unicorno in un nuovo processo. Funziona bene se semplicemente uccido il processo principale e poi ricomincio l'unicorno di nuovo, ma poi ci sono un minuto o più di richieste perse.
Sì, 'preload_app' è impostato su true. Grandi informazioni!La mia unica domanda è qual è il modo migliore per identificare il vecchio id del processo unicorno? –
.oldbin o (vecchio) verrebbe aggiunto al nome del vecchio processo in modo da poter pipe 'ps' a un' grep' per unicorno e vecchio –
Ho modificato l'OP con un aggiornamento. Grazie per l'aiuto che hai offerto finora. –