Come riavviare lo script perl in esecuzione sotto mod_fcgid quando è cambiato?

StackOverflow https://stackoverflow.com//questions/9675286

  •  12-12-2019
  •  | 
  •  

Domanda

Sto eseguendo alcuni script FastCGI sotto mod_fcgid, e vorrei che quelli di ricaricare automaticamente ogni volta che apporti modifiche allo script.

Sotto mod_fastcgi, è possibile configurare

FastCgiConfig -autoUpdate
.

Per fare esattamente questo, ma mod_fcgid non ha un'opzione del genere. Qualcuno ha una buona soluzione per questo?

La cosa migliore con cui ho inventato, è:

while (my $cgi = CGI::Fast->new()) {
    processRequest($cgi);
    exit if -M $0 < 0;  # restart if script changed
}
.

che esce dopo aver gestito un'altra richiesta.Ma questo non è ideale, specialmente quando ci sono più istanze dello script in esecuzione, potrebbe richiedere un bel po 'prima che tutte le vecchie istanze abbiano avuto un'opportunità per scappare ancora una volta e uscire.

Se faccio il exit prima di processRequest, l'utente riceve un errore, quindi non lo farà.

Grazie in anticipo,

- Michael

È stato utile?

Soluzione

Il modo giusto per farlo è un po 'sottile.Consiglierei di guardare a PLACK :: Loader :: RESTARTER per comefallo, o meglio ancora adattando l'app per eseguire su palato e quindi basta lanciarlo con l'opzione -r di Plackup per caricare automaticamente il RESTARTER.Adattare la tua app potrebbe essere più facile di quanto ti aspetti, possibilmente facile come il cambio

use CGI::Fast;
while (my $cgi = CGI::Fast->new) {
    processRequest($cgi);
}
.

a

use CGI::Emulate::PSGI;
use CGI;

my $app = CGI::Emulate::PSGI->handler(sub {
    my $cgi = CGI->new;
    processRequest($cgi);
});
.

(Scrivere un'applicazione PSGI nativa appropriata è ancora più bella, ma questa versione ti consente di riscrivere la maggior parte della tua app).

Altri suggerimenti

Non l'ho provato affatto, ma Module::Refresh Lavoro per il tuo mod_fcgidscopi?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top