2012-08-23 2 views
9

Ich verwende EventMachine und Monetarily, um TCP-Server zusammen mit meiner Rails-Anwendung zu starten. Dies wird von config/initializers/momentarily.rb gestartet.Ermitteln, ob die Anwendung als HTTP-Server gestartet wurde oder nicht (Rake-Task, Rconsole usw.)

Mein Problem ist, dass es auch startet, wenn ich Rake-Aufgaben wie db:migrate ausführen. Ich möchte nur, wenn ich den HTTP-Server starte. Umgebungen werden nicht helfen, da sich sowohl die Serverstart- als auch die Rake-Aufgaben in der Entwicklungsumgebung befinden. Gibt es eine Möglichkeit zu wissen, dass die Anwendung den HTTP-Server im Gegensatz zu allem anderen ausführt? Beachte, dass das nicht nur Rake-Aufgaben sind, sondern der EM auch startet, wenn ich die Rails-Konsole betreibe, was wiederum für meinen Fall etwas nicht wünschenswert ist.

Antwort

6

Es gibt keine gute Möglichkeit, dies zu tun, die ich kenne. Sie könnten newrelic ‚s Ansatz (Check discover_dispatcher in local_environment.rb) zu kopieren, die im Grunde eine Liste von Heuristiken verwendet hat, um festzustellen, ob es innerhalb Passagier läuft, dünn, usw.

Für Fahrgast es

defined?(::PhusionPassenger) 

prüft für dünn überprüft er

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

Das ist eigentlich vielversprechend. Vielen Dank! –

+0

Das scheint bei mir in Rails 4 mit Beifahrer nicht zu funktionieren. –

+0

Die Konstante zu überprüfen scheint zu sein :: PhusionPassenger jetzt –

0

Vielleicht können Sie einen Schalter im Initialisierer basierend auf ARGV implementieren?

Etwas wie:

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

es würde in der Produktion arbeiten müssen, auch wenn sie unter Apache läuft –

0

nicht, dass andere Server von einem initializer starten Sie. Erstellen Sie eine daemon in script/momentarily und starten Sie es aus Ihrer App heraus.

+0

ich noch wissen müsste, wenn der Daemon gestartet werden und wenn nicht –

0

Nachdem Ihre Anwendung gestartet wurde, können Sie sie überprüfen ps. Wenn ps zeigt, dass der HTTP-Server ausgeführt wird und der laufende HTTP-Server dieselbe PID wie Ihre Anwendung hat (überprüfen Sie die PID, indem Sie $$ überprüfen), können Sie den TCP-Server starten.

+0

aber dies wird funktioniert nicht, wenn ich 'rails server' betreibe. –

+0

Ja wird es. Wenn Sie rails server 'ps aux | grep rails' enthält etwas wie 'remus 18454 0.0 0.8 2515572 65968 s000 S + 11:10 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

sauberste der dreckigen. Vielen Dank! –

3

eine Umgebungsvariable in config.ru Datei fest, und es überall im Code verwenden, um festzustellen, ob es nur einen rails server Befehl ausgeführt ist verwenden.

Für z.B.

  • Datei:config.ru

    ENV['server_mode'] = '1' 
    

Und mit ihm irgendwo als:

  • Datei:config/environment.rb

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

Referenz: Answer

Verwandte Themen