2009-04-07 15 views
6

Ok, quindi mi piacerebbe creare un'azione in Rails per riavviarsi. Ho fatto un po 'di ricerca ed ho trovato:Come riavviare Rails dall'interno di Rails?

http://snippets.dzone.com/posts/show/5002

Il che suggerisce 2 comandi, uno per fermare e un altro per riavviare. I seguenti uccisioni:

ps -a|grep "/usr/local/bin/ruby script/server"|grep -v "grep /usr"|cut -d " " -f1|xargs -n 1 kill -KILL $1 

Il segnale HUP non si riavvia per me, così ho cercato di storpiare il comando precedente (regolata in modo il comando ha funzionato bene con il modo stavo iniziando il server con Ubuntu):

ps -eaf|grep "ruby script/server"|grep -v grep|cut -d " " -f3|xargs -n 1 kill -KILL $1;script/server 

Questo funziona bene nel mio ambiente, così ho cercato di impostare un'azione di eseguirlo:

def restart 
    fork { exec "ps -eaf|grep \"ruby script/server\"|grep -v grep|cut -d \" \" -f3|xargs -n 1 kill -KILL $1;script/server" } 
    redirect_to "/server_maintenance" 
end 

l'azione uccide la multa server, ma in realtà non avviare il server back u p:

=> Booting Mongrel 
=> Rails 2.3.2 application starting on http://0.0.0.0:3000 
=> Call with -d to detach 
=> Ctrl-C to shutdown server 
Exiting 
/usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize_without_backlog': Address already in use - bind(2) (Errno::EADDRINUSE) 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/tcphack.rb:12:in `initialize' 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `new' 
    from /usr/lib/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:93:in `initialize' 
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `new' 
    from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/vendor/rack-1.0/rack/handler/mongrel.rb:10:in `run' 
    from /usr/lib/ruby/gems/1.8/gems/rails-2.3.2/lib/commands/server.rb:111 
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
    from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
    from script/server:3 

io non sono molto Capire perché l'indirizzo è già in uso quando Mongrel sembra essere appena uscito.

Ho trovato questa domanda:

How do you restart Rails under Mongrel, without stopping and starting Mongrel

ma i segnali non causano il riavvio nel mio ambiente, hanno appena finiscono per uccidere il processo.

Qualcuno ha qualche idea su cosa può funzionare? Per alcune note sul mio ambiente: ho installato Rails da una nuova versione di RubyGems e Mongrel. Io uso script/server per avviare il server, che ovviamente usa Mongrel. Sono su Ubuntu Hardy Heron.

risposta

3

Ok ho trovato una soluzione ... ho cambiato Come vorrei iniziare a rotaie:

mongrel_rails start -d 

e ora il seguente azione lo farà:

def restart 
    fork { exec "mongrel_rails restart" } 
    redirect_to "/server_maintenance" 
end 

Come un avvertimento, il redirect_to sarà causa un caricamento fallito perché il server sarà inattivo ... tuttavia una ricarica dopo una pausa mostrerà che il riavvio ha avuto successo. Questo potrebbe essere risolto cambiando il riavvio da fare con AJAX, seguito da un javascript reload ... ma lascerò che questo sia un esercizio per il lettore.

4

Se non ti dispiace passare a mod_rails, puoi riavviare il server creando $ RAILS_ROOT/tmp/restart.txt, che causa solo l'istanza di Rails che ti interessa riavviare.

Il comando PS sembra (sguardo celeste) come se uccidesse tutti i processi di rotaie sulla tua scatola. Va bene se sei l'unica app per Rails su una macchina, ma se ce ne sono alcuni in esecuzione come lo stesso utente o sei in esecuzione come root, li ucciderai tutti. Cattiva forma!

This indica per bastardo. C'è il modo in cui vuoi provare.

+0

Grazie per la risposta! In realtà l'ho fatto funzionare un po 'prima che tu rispondessi, ma il link mostra più o meno come l'ho fatto funzionare, quindi avrò l'uptote! –

0

Nella nostra consulenza con le startup che eseguono i loro siti su Rails, abbiamo utilizzato due metodi per la gestione dei processi ibridi.

In primo luogo, è una gemma personalizzata che abbiamo scritto chiamato mongrel_runit. Ciò pone i meticci come servizi in runit.

In secondo luogo, abbiamo utilizzato god per monitorare i processi ibridi. Funzionerà con mongrel_runit, o con configurazioni "normali" di ibridi.

+0

Grazie per la risposta! Sfortunatamente, questo non soddisfa esattamente le mie esigenze personali. Inoltre ti suggerisco di aggiungere ulteriori informazioni su mongrel_runit sia qui che sulla pagina del progetto ... non è del tutto chiaro cosa faccia. –