11
votes

Détecter si l'application a été démarrée en tant que serveur HTTP ou non (tâche Rake, RConsole, etc.)

J'utilise EventMachine et monétairement pour démarrer E TCP Server avec My Rails Application. Ceci est démarré à partir de config / initialiseurs / momentanément.rb .

Mon problème est qu'il commence aussi lorsque je exécuterai des tâches Rake, comme dB: migrer . Je veux seulement qu'il démarre lorsque je démarre le serveur HTTP. Les environnements ne vous aideront pas, car les tâches de départ du serveur et de râteau sont dans un environnement de développement. Existe-t-il une façon de savoir que l'application exécute le serveur HTTP par opposition à quelque chose d'autre? Notez que ce n'est pas seulement des tâches Rake, l'EM commence également si j'exécute la console de rails, qui est à nouveau quelque chose qui n'est pas souhaitable pour mon cas.


0 commentaires

6 Réponses :


0
votes

Peut-être que vous pouvez implémenter un commutateur dans l'initialiszer en fonction de argv ?

quelque chose comme: xxx


1 commentaires

Il faudrait aussi travailler dans la production, lors de la course sous Apache



0
votes

Ne démarrez pas cet autre serveur d'un initialiseur. Créez un Daemon dans Script / momentanément et démarrez-le dans votre application.


1 commentaires

J'aurais toujours besoin de savoir quand commencer le démon et quand pas



0
votes

Après que votre application se lance, vous pourriez avoir une sortie de coquille pour vérifier ps . Si PS montre que le serveur HTTP est en cours d'exécution et que le serveur HTTP exécuté a le même PID que votre application (cochez le PID en inspectant $$ ), puis vous pouvez lancer le Server TCP.


1 commentaires

Oui, il sera. Lorsque vous exécutez Rails Server PS AUX | Rails Grep contiendra quelque chose comme Remus 18454 0.0 0,8 2515572 65968 S000 S + 11:10 AM 0: 01.51 /USERSERS/REMUS/.RVM/RUBIES/RUBY-1.9.3-P125/BIN/RUBY Script / Rails Server



9
votes
unless File.basename($0) == "rake" && ARGV.include?("db:migrate")
  # you are not in rake db:migrate
end

1 commentaires

Le plus propre du sale. Merci!



6
votes

Il n'y a pas de bonne façon de faire cela que je connais. Vous pouvez copier approche NewRelic S (cocher découverte_dispatcher dans local_environment.rb a essentiellement une liste des heuristiques utilisées pour détecter s'il est est en cours d'exécution à l'intérieur du passager, mince, etc.

pour le passager, il vérifie xxx

pour la fin de contrôle xxx


4 commentaires

C'est en fait prometteur. Merci!


Cela ne semble pas fonctionner pour moi dans des rails 4 avec passager.


La constante à vérifier semble être :: PhusionPassenger maintenant


@Danherman ressemble à la constante à vérifier modifiée ou c'était une faute de frappe tout au long de



7
votes

Définir une variable d'environnement dans fichier config.ru et l'utiliser n'importe où dans le code pour détecter s'il est exécuté à l'aide d'un serveur Rails uniquement.

pour par exemple

  • fichier: config.ru XXX

    et l'utiliser quelque part comme suit:

    • fichier: config / environnement.rb XXX


      Référence: Réponse


0 commentaires