Определить, было ли приложение запущено как HTTP-сервер или нет (rake task, rconsole и т. д)


Я использую EventMachine и монетарно для запуска сервера E TCP вместе с моим приложением rails. Это начинается с config/initializers/momentarily.rb.

Моя проблема в том, что он запускается также, когда я выполняю задачи rake, такие как db:migrate. Я только хочу, чтобы он начинался, когда я запускаю HTTP-сервер. Среды не помогут, так как и задачи запуска сервера, и задачи rake находятся в среде разработки. Есть ли способ узнать, что приложение работает на HTTP-сервере в отличие от всего остального? Обратите внимание, что это не только грабли задач, ЭМ запускается также, если я запускаю консоль rails, что опять-таки что-то не желательное для моего случая.

6 9

6 ответов:

Насколько я знаю, нет лучшего способа сделать это. Вы можете скопировать подходnewrelic (Проверьте discover_dispatcher в local_environment.rb ), который в основном имеет список эвристик, используемых для обнаружения, работает ли он внутри пассажира, тонкого и т. д.

Для пассажира он проверяет

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 и запустите его из вашего приложения.

После запуска приложения вы можете использовать его для проверки ps. Если ps показывает, что HTTP-сервер работает, и у запущенного HTTP-сервера есть тот же pid, что и у вашего приложения (проверьте pid, проверив $$), то вы можете запустить TCP-сервер.