2014-05-23 5 views
6

Devo eseguire determinate inizializzazioni a seconda del server Web utilizzato per avviare l'applicazione. È possibile rilevarlo a livello di codice dall'inizializzatore di rotaie?Come rilevare quale server (thin, puma, passeggero, ...) viene utilizzato per l'applicazione Rails?

+3

Perché avete bisogno di sapere che, che tipo di inizializzazione dipende dal tipo di server web? Dicci di più su ciò che vuoi ottenere, forse c'è un modo migliore. Mi sembra strano che un'applicazione dovrebbe essere responsabile della ricerca di tali informazioni. Penso che sia una buona idea passare queste informazioni all'app (via ENV per esempio). – spickermann

+0

Sì, lo so che è un po 'strano ... E ho paura che sarà più strano se entrerò nei dettagli. Ma ... Esistono processi figli avviati dalla nostra app per rails (usiamo il web driver del selenio per fare screenshot sul lato server, che esegue il processo figlio di firefox). Il problema è che thin non uccide questi processi su stop/restart, ma lo fa il Passenger. Quindi mi piacerebbe chiudere firefox manualmente solo quando l'app funziona sottosopra. Anche se non so ancora come catturare l'evento di uscita perché il gestore di at_exit non viene richiamato al riavvio, solo all'arresto. –

+0

In realtà, ho bisogno di un modo sicuro per chiudere tutti i processi figli dell'app rails quando viene arrestato/riavviato, non dipende da un particolare server web, ma è, probabilmente, un'altra domanda. –

risposta

1

Anche se non è così pulito, è possibile utilizzare

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

e così via. Questo funzionerà per questi tre, e devi controllare se funziona con gli altri.

+0

Purtroppo questo non è molto affidabile. Posso avere gemma sottile inclusa in Gemfile, ma l'applicazione può essere avviata tramite il modulo Passenger in nginx –

+0

Questo è vero. Aspettiamo altre risposte, se ce ne sono. –

+1

Vedere questa risposta sul dispatcher di NewRelic http://stackoverflow.com/a/12246652/391826 – jaygooby

0

Ecco una sorta di modo hacky per farlo (in config/application.rb add):

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 
+0

Sfortunatamente, non funziona se il server viene avviato non tramite il comando 'rails server'. Nel mio caso, thin è avviato tramite 'thin start' e Passenger è un modulo nginx. –

0

è possibile verificare se il processo è in esecuzione o non utilizzo di ps aux

ps aux | grep passenger 
ps aux | grep puma 
ps aux | grep unicorm 
Problemi correlati