如何检测Rails应用程序使用的服务器是什么(thin,puma,passenger等)?

10

我需要根据启动应用程序的Web服务器执行某些初始化。是否可以从Rails initializer程序中以编程方式检测它?


3
为什么你需要知道这个,什么样的初始化取决于Web服务器的类型?告诉我们更多关于你想要实现什么,也许有更好的方法。我觉得一个应用程序应该负责查找这样的信息听起来很奇怪。我认为将这些信息传递给应用程序(例如通过ENV)是一个更好的想法。 - spickermann
是的,我知道这有点奇怪...我担心如果我进一步解释会更加奇怪。但是...从我们的rails应用程序启动了子进程(我们使用selenium webdriver进行服务器端截图,它运行firefox子进程)。问题是thin在停止/重启时不会杀死这些进程,但是Passenger会。因此,我想仅在应用程序在thin下运行时手动关闭firefox。尽管我不知道如何捕获“退出事件”,因为at_exit处理程序仅在停止而非重新启动时调用。 - Stas S
实际上,我需要一种保证关闭Rails应用程序的所有子进程的方法,无论特定的Web服务器如何停止/重新启动,但这可能是另一个问题。 - Stas S
3个回答

1

虽然不是很干净,但你可以使用

defined?(::Thin) 
defined?(::Unicorn)
defined?(::Passanger)

等等。这对这三个会起作用,你必须检查它是否适用于其他情况。


很遗憾,这并不是非常可靠的。我可以在Gemfile中包含thin gem,但应用程序可以通过nginx中的Passenger模块启动。 - Stas S
没错。如果有的话,让我们等待其他答案。 - roman-roman
1
关于NewRelic的调度程序,请参考这个答案:https://dev59.com/Tmct5IYBdhLWcg3wctCG#12246652 - jaygooby

1

您可以使用 ps aux 命令来检查进程是否正在运行。

ps aux | grep passenger
ps aux | grep puma
ps aux | grep unicorm

OP问道“从Rails初始化程序中以编程方式检测它”,这意味着使用Ruby代码。现在你仍然可以运行系统命令,但仍然无法获得所需的结果。 - Cyril Duchon-Doris
@CyrilDuchon-Doris 当我们运行上述命令时,我们将不会得到什么期望的结果? - Aniket Tiwari
虽然您可以将它们作为系统命令运行,但如果您有多个进程打开(即多个乘客进程正在运行),这将无法帮助您检测当前应用程序是否使用 Web 服务器运行。 - Cyril Duchon-Doris

0
这是一种有点hacky的方法(在config/application.rb中添加):
module Rails
  class Server < ::Rack::Server
    alias_method :old_start, :start
    def start
      puts server.name # or set an ENV variable
      old_start
    end
  end
end

不幸的是,如果服务器不是通过“rails server”命令启动,则无法工作。在我的情况下,thin是通过“thin start”启动的,而Passenger是一个nginx模块。 - Stas S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接