我正在使用EventMachine和Monetarily与我的rails应用程序一起启动TCP服务器。这是从config/initializers/momentarily.rb
开始的。
我的问题是,当我运行rake任务时,它也会启动,例如db:migrate
。我只想在启动HTTP服务器时启动它。环境无济于事,因为服务器启动和rake任务都在开发环境下。有没有办法知道应用程序正在运行HTTP服务器而不是其他任何东西?请注意,不仅是rake任务,如果我运行rails控制台,EM也会启动,这对我的情况来说也是不可取的。
答案 0 :(得分:6)
unless File.basename($0) == "rake" && ARGV.include?("db:migrate")
# you are not in rake db:migrate
end
答案 1 :(得分:6)
我知道这并不是一个很好的方法。你可以复制newrelic的方法(检查local_environment.rb中的discover_dispatcher
),它基本上有一个启发式列表,用于检测它是否在乘客,瘦身等区域内运行。
对于乘客来说,检查
defined?(::PhusionPassenger)
进行瘦身检查
if defined?(::Thin) && defined?(::Thin::Server)
答案 2 :(得分:4)
在config.ru
文件中设置一个环境变量,并在代码中的任何位置使用它来检测它是否仅使用rails server
命令执行。
例如
文件: config.ru
ENV['server_mode'] = '1'
在某处使用它:
文件: config/environment.rb
Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1'
参考:Answer
答案 3 :(得分:0)
也许你可以根据ARGV
?
类似的东西:
if ARGV.join(' ').match /something/
# your initializer code here
end
答案 4 :(得分:0)
不要从初始化程序启动其他服务器。在script/momentarily
中创建daemon,然后在您的应用内启动它。
答案 5 :(得分:0)
在您的应用程序启动后,您可以将其弹出来检查ps
。如果ps
显示HTTP服务器正在运行且正在运行的HTTP服务器与您的应用程序具有相同的pid(通过检查$$
检查pid),那么您可以启动TCP服务器。