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