2012-02-29 5 views
5

Sono un po 'confuso riguardo alla mia strategia di implementazione qui, quando distribuisco in quali circostanze vorrei inviare un segnale reload a unicorno? Per esempio nel mio caso sarebbe come:Usa `reload` invece di` restart` per Unicorn?

sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid` 

Sto schierando le mie applicazioni uccidendo che pid, poi a partire unicorno sempre via qualcosa come:

bundle exec unicorn -c config/unicorn/production.rb -E production -D 

Sto solo chiedendo perché Vorrei usare la ricarica? Posso ottenere prestazioni per il mio sviluppo facendo così?

risposta

14

Quando si uccide unicorno si causano tempi di inattività, fino a quando l'unicorno può ricominciare. Quando si usa il segnale USR2, l'unicorno avvia prima i nuovi lavoratori, quindi una volta in esecuzione, uccide i vecchi lavoratori. In pratica si tratta di rimuovere la necessità di "spegnere" l'unicorno.

Nota: si presuppone che si abbia il gancio documentato before_fork nella configurazione di unicorno, per gestire l'uccisione dei lavoratori precedenti, nel caso in cui venga trovato un file ".oldbin" contenente il PID del vecchio processo unicorno :

before_fork do |server, worker| 
    # a .oldbin file exists if unicorn was gracefully restarted with a USR2 signal 
    # we should terminate the old process now that we're up and running 
    old_pid = "#{pids_dir}/unicorn.pid.oldbin" 
    if File.exists?(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