I\'m using EventMachine and Monetarily to start e TCP server along with my rails application. This is started from config/initializers/momentarily.rb
.
unless File.basename($0) == "rake" && ARGV.include?("db:migrate")
# you are not in rake db:migrate
end
Set an environment variable in config.ru
file, and use it anywhere in the code to detect if it's executed using a rails server
command only.
For e.g.
File: config.ru
ENV['server_mode'] = '1'
And using it somewhere as:
File: config/environment.rb
Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1'
Reference: Answer
After your application launches, you could have it shell out to check ps
. If ps
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.
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
defined?(::PhusionPassenger)
for thin it checks
if defined?(::Thin) && defined?(::Thin::Server)
Maybe you can implement a switch in the initializer based on ARGV
?
Something like:
if ARGV.join(' ').match /something/
# your initializer code here
end
Don't start that other server from an initializer. Create a daemon in script/momentarily
and start it from within your app.