检测应用程序是否作为HTTP服务器启动(rake task,rconsole等)

时间:2012-08-23 08:50:32

标签: ruby-on-rails ruby rake eventmachine

我正在使用EventMachineMonetarily与我的rails应用程序一起启动TCP服务器。这是从config/initializers/momentarily.rb开始的。

我的问题是,当我运行rake任务时,它也会启动,例如db:migrate。我只想在启动HTTP服务器时启动它。环境无济于事,因为服务器启动和rake任务都在开发环境下。有没有办法知道应用程序正在运行HTTP服务器而不是其他任何东西?请注意,不仅是rake任务,如果我运行rails控制台,EM也会启动,这对我的情况来说也是不可取的。

6 个答案:

答案 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服务器。