检测应用程序是否作为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服务器。