2011-12-12 15 views
10

Di seguito è riportato il collegamento al mio script di init per unicorno. https://gist.github.com/1466775Il riavvio/aggiornamento di Unicorn non funziona

Il comando di riavvio non ha mai funzionato per me. Sto usando l'aggiornamento per riavviare unicorno dopo ogni distribuzione. Ma ogni volta che si verificano cambiamenti importanti come l'aggiunta di nuove gemme, l'aggiornamento non funzionerà. Recentemente, ho sostituito gemma hoptoad con airbrake e si sbaglia dicendo "costante non inizializzata Airbrake (NameError)". Ma quando mi sono fermato e ho ricominciato l'unicorno, ha funzionato bene. Il problema si trova nello script di init o nel suo diverso problema?

Grazie.

risposta

11

Secondo il vostro script di init, "restart /bin/init.d/unicorn" invia il segnale HUP al processo maestro unicorno

------ ritagliata

restart|reload) 
    sig HUP && echo reloaded OK && exit 0 
    echo >&2 "Couldn't reload, starting '$CMD' instead" 
    su - $USER -c "$CMD" 

---- -cropped

Questo è ciò che fa HUP al processo unicorno:

ricariche file di configurazione e riavviare con grazia tutti i lavoratori. Se la direttiva "preload_app" è falsa (impostazione predefinita), anche i worker rileveranno eventuali modifiche al codice dell'applicazione al riavvio. Se "preload_app" è vero, le modifiche al codice dell'applicazione non avranno alcun effetto.

Quello che stai cercando è il segnale USR2 che il tuo parametro di aggiornamento per unicorno sta già facendo!

Il segnale USR2 esegue nuovamente il binario in esecuzione. Un QUIT separato deve essere inviato al processo originale una volta verificato che il bambino sia attivo e in esecuzione.

+0

Mentre questo è corretto, non possiamo dire quale sia il tuo problema senza vedere la configurazione di unicorno. Fondamentalmente, se imposta 'preload_app' su true da qualche parte, dovrai usare il comando" upgrade "E avrai bisogno di avere un codice extra nella tua configurazione unicorno per farlo funzionare. Google "unicorn zero downtime deploy" dovrebbe portare degli esempi. Se ** non ** imposti 'preload_app', il tuo' restart' sarebbe l'opzione corretta, ma riavvierà completamente il server, causandone la connessione offline per un momento. – averell

10

ho avuto un problema molto simile e, infine, found the solution

avevo guardato attraverso i log prima, ma, ovviamente, non è riuscito a vedere l'errore (Bundler::GemfileNotFound). Risulta che ci sono vecchi riferimenti a versioni precedenti e una volta che il file gem cambia, il nuovo master fallisce silenziosamente. Coda del tuo registro unicorno per vedere cosa succede. I miei problemi sono stati tutti risolti come per il collegamento con il seguente nel mio unicorn.rb

before_exec do |server| 
    ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile" 
end 
+3

[Questo] (https://github.com/sosedoff/capistrano-unicorn/commit/c1e7a3f2794dd070367d0808ad102a6d20d39cf2) potrebbe essere una soluzione leggermente migliore. – Anjan

+0

@anjan Sì, bella scoperta. Al momento non sto usando la gemma di capistrano-unicorno, ma sarebbe una buona soluzione per quelli che sono. – toxaq

2

ho avuto lo stesso problema, ma ero usando rbenv che è stato installato su per utente. Ho usato questo init script

ho capito che dopo la mia rbenv installato su base per utente Ho bisogno di cambiare un po 'questo:

CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" 

con questo:

CMD="cd $APP_ROOT; ~/.rbenv/bin/rbenv exec bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E production" 

Spero che vi aiuterà !

P.S. o qualcun altro dato che è una vecchia domanda =)

0

Ho risolto questo problema cambiando il mio init unicorno.d script da

CMD="cd $APP_ROOT; bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging" 

a questo:

CMD="cd $APP_ROOT; BUNDLE_GEMFILE=$APP_ROOT/Gemfile bundle exec unicorn -D -c $APP_ROOT/config/unicorn.rb -E staging" 

che sembra puntare al nuovo Gemfile fascio su ogni nuova release. Prendendo spunto da this merge request