2012-08-23 10 views
9

Sto utilizzando EventMachine e Monetarily per avviare il server TCP insieme alla mia applicazione di binari. Questo è iniziato da config/initializers/momentarily.rb.Rileva se l'applicazione è stata avviata come server HTTP o meno (rake task, rconsole ecc.)

Il mio problema è che si avvia anche quando eseguo attività di rake, come db:migrate. Voglio solo che inizi quando quando avvio il server HTTP. Gli ambienti non saranno d'aiuto, dal momento che le attività di avvio e rake del server sono in ambiente di sviluppo. C'è un modo per sapere che l'applicazione sta eseguendo il server HTTP rispetto a qualsiasi altra cosa? Nota che non sono solo le attività di rake, l'EM si avvia anche se eseguo la console di rails, che è di nuovo qualcosa che non è desiderabile per il mio caso.

risposta

6

Non c'è un ottimo modo per farlo che io conosca. Si potrebbe copiare l'approccio 's newrelic (check discover_dispatcher in local_environment.rb) che ha in pratica una lista di euristiche utilizzato per rilevare se è in esecuzione all'interno del passeggero, sottile, ecc

Per passeggero controlla

defined?(::PhusionPassenger) 

per sottile controlla

if defined?(::Thin) && defined?(::Thin::Server) 
+0

Questo è davvero promettente. Grazie! –

+0

Questo non sembra funzionare per me in Rails 4 con passeggero. –

+0

La costante da controllare sembra essere :: PhusionPassenger ora –

0

Forse è possibile implementare un interruttore nell'inizializzatore basato su ARGV?

Qualcosa di simile:

if ARGV.join(' ').match /something/ 
    # your initializer code here 
end 
+0

avrebbe dovuto lavorare nella produzione anche durante l'esecuzione in Apache –

0

Non avviare quell'altro server da un inizializzatore. Crea un daemon in script/momentarily e avvialo dall'interno della tua app.

+0

avrei ancora bisogno di sapere quando iniziare il demone e quando non –

0

Dopo l'avvio dell'applicazione, è possibile farlo uscire per controllare ps. Se ps indica che il server HTTP è in esecuzione e il server HTTP in esecuzione ha lo stesso pid dell'applicazione (controllare il pid controllando $$), è possibile avviare il server TCP.

+0

Ma questa volontà non funziona quando eseguo 'rails server'. –

+0

Sì, lo farà. Quando si esegue il server di rails 'ps aux | grep rails' conterrà qualcosa come 'remus 18454 0.0 0.8 2515572 65968 s000 S + 11:10 AM 0: 01.51 /Users/remus/.rvm/rubies/ruby-1.9.3-p125/bin/ruby script/rails server' –

6
unless File.basename($0) == "rake" && ARGV.include?("db:migrate") 
    # you are not in rake db:migrate 
end 
+0

Il più pulito del sporco. Grazie! –

3

impostare una variabile di ambiente in config.ru file e utilizzarlo in qualsiasi parte del codice per rilevare se è eseguito utilizzando solo un comando rails server.

Ad es.

  • File:config.ru

    ENV['server_mode'] = '1' 
    

e di utilizzarlo in qualche luogo come:

  • File:config/environment.rb

    Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1' 
    

Riferimento: Answer

Problemi correlati