I'm using EventMachine and Monetarily to start e TCP server along with my rails application. This is started from config/initializers/momentarily.rb
.
My problem is that it starts also when I run rake tasks, like db:migrate
. I only want it to start when when I start the HTTP server. Environments won't help, since both the server start and rake tasks are under Development environment. Is there a way of knowing that the application is running the HTTP server as opposed to anything else? Note that is not only rake tasks, the EM starts also if I run the rails console, which is again something not desirable for my case.
Maybe you can implement a switch in the initializer based on
ARGV
?Something like:
Don't start that other server from an initializer. Create a daemon in
script/momentarily
and start it from within your app.There's not a great way of doing this that I know of. You could copy newrelic's approach (check
discover_dispatcher
in local_environment.rb) which basically has a list of heuristics used to detect if it is running inside passenger, thin, etc.For passenger it checks
for thin it checks
After your application launches, you could have it shell out to check
ps
. Ifps
shows that the HTTP server is running and the running HTTP server has the same pid as your application (check the pid by inspecting$$
), then you could launch the TCP server.Set an environment variable in
config.ru
file, and use it anywhere in the code to detect if it's executed using arails server
command only.For e.g.
File:
config.ru
And using it somewhere as:
File:
config/environment.rb
Reference: Answer