¿Cómo reiniciar el script Perl que se ejecuta bajo mod_fcgid cuando se modifica?

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

  •  12-12-2019
  •  | 
  •  

Pregunta

Estoy ejecutando algunos scripts FastCGI en mod_fcgid, y me gustaría que se recargaran automáticamente cada vez que realice algún cambio en el script.

Bajo mod_fastcgi, puedes configurar

FastCgiConfig -autoUpdate

hacer exactamente eso, pero mod_fcgid no tiene esa opción.¿Alguien tiene una buena solución para esto?

Lo mejor que se me ocurrió es:

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

que sale después de manejar una solicitud más.Pero esto no es ideal, especialmente cuando hay varias instancias del script ejecutándose, puede pasar bastante tiempo antes de que todas las instancias antiguas tengan la oportunidad de ejecutarse una vez más y salir.

si hago el exit antes processRequest, el usuario recibe un error, por lo que tampoco funcionará.

Gracias de antemano,

- Miguel

¿Fue útil?

Solución

La forma correcta de hacerlo es un poco sutil.Yo recomendaría mirar Placa::Cargador::Reiniciador para saber cómo hacerlo, o mejor aún, adaptar su aplicación para que se ejecute en Plack y luego simplemente ejecutarla con plackup -r opción para cargar el reiniciador automáticamente.Adaptar su aplicación puede ser más fácil de lo que espera, posiblemente tan fácil como cambiar

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);
});

(Escribir una aplicación PSGI nativa adecuada es aún mejor, pero esta versión le evita tener que reescribir la mayor parte de su aplicación).

Otros consejos

No he probado esto en absoluto, pero lo haría Module::Refresh trabajar para tu mod_fcgid propósitos?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top