12

我正在使用EventMachineMonetarily来启动 e TCP 服务器以及我的 rails 应用程序。这是从config/initializers/momentarily.rb.

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

4

7 回答 7

9
unless File.basename($0) == "rake" && ARGV.include?("db:migrate")
  # you are not in rake db:migrate
end
于 2012-09-03T06:19:23.027 回答
8

据我所知,没有一种很好的方法可以做到这一点。您可以复制newrelic的方法(检查local_environment.rbdiscover_dispatcher ) ,它基本上有一个启发式列表,用于检测它是否在乘客、瘦身等内部运行。

对于乘客,它会检查

defined?(::PhusionPassenger)

对于薄它检查

if defined?(::Thin) && defined?(::Thin::Server)
于 2012-09-03T11:09:00.537 回答
7

在文件中设置环境变量config.ru,并在代码中的任何位置使用它来检测它是否rails server仅使用命令执行。

例如

  • 文件: config.ru

    ENV['server_mode'] = '1'
    

并在某处使用它:

  • 文件: config/environment.rb

    Thread.new { infinite_loop! }.join if ENV['server_mode'] = '1'
    

参考:答案

于 2015-04-15T11:52:16.753 回答
0

也许您可以在初始化程序中基于ARGV?

就像是:

if ARGV.join(' ').match /something/
  # your initializer code here
end
于 2012-08-23T09:35:41.813 回答
0

不要从初始化程序启动其他服务器。在其中创建一个守护程序script/momentarily并从您的应用程序中启动它。

于 2012-08-23T10:34:18.897 回答
0

在您的应用程序启动后,您可以将其用于检查ps. 如果ps显示 HTTP 服务器正在运行并且正在运行的 HTTP 服务器与您的应用程序具有相同的 pid(通过检查来检查 pid $$),那么您可以启动 TCP 服务器。

于 2012-09-01T09:25:54.347 回答
0

除了上面 Frederick Cheung 的一个很好的回答,实际过程环境中可能还有一些其他的“足迹”。例如。Phusion Passenger 向 ENV 添加了某些变量,例如:

PASSENGER_APP_ENV
IN_PASSENGER
PASSENGER_SPAWN_WORK_DIR
PASSENGER_USE_FEEDBACK_FD

Web 服务器通常也可以设置SERVER_SOFTWARE变量,例如:

SERVER_SOFTWARE=nginx/1.15.8 Phusion_Passenger/6.0.2
于 2021-10-15T09:33:43.707 回答