Detectar cuando se completa la recarga elegante de Apache

Detectar cuando se completa la recarga elegante de Apache

Parece que la recarga elegante de Apache (apachectl elegante) es una operación asincrónica. Si lo invoco desde un script, el script continuará mientras Apache hace su trabajo, lo que puede llevar una cantidad de tiempo indeterminada (por ejemplo, clientes lentos, descargas largas).

Me gustaría detectar mediante programación cuándo se completa la recarga y Apache ahora se está ejecutando con la nueva configuración. En otras palabras, me gustaría encontrar alguna manera de tratarlo como una llamada sincrónica que sólo continúa una vez que Apache finaliza.

¿Cómo harías eso si fueras yo?

Agregado el 9/12: Parece que Apache reinicia los subprocesos inactivos con la nueva configuración, pero los subprocesos con conexiones abiertas mantienen la configuración anterior hasta que finaliza la conexión. Entonces, tal vez la pregunta podría plantearse con mayor precisión sobre determinar cuándo Apache comienza a aceptar nuevas conexiones con la nueva configuración.

Respuesta1

Supongo que necesito resolver mi propio problema...

Aquí hay una parte de Perl que se me ocurrió. Básicamente, encuentro el final del archivo de registro de Apache y lo memorizo. Luego hago un reinicio/recarga de Apache y miro qué texto se ha escrito en el archivo de registro desde entonces. Si el texto contiene "reanudando operaciones normales", considero que el reinicio/recarga se ha completado. (No estoy seguro de que sea cierto, pero así lo parece en la página de Apache sobre "Detener y reiniciar" aquí:http://httpd.apache.org/docs/2.2/stopping.html)

Se agradecen mejoras.

my $lastPos;

sub textSinceLast {
    my $logF  = '/var/log/httpd/error_log'; # or wherever your Apache log file is

    open( FH, '<', $logF ) || die( "Cannot open $logF" );
    my $pos  = sysseek( FH, 0, SEEK_END );
    my $ret = "Still at mark";

    if( defined( $lastPos ) && $pos != $lastPos ) {
        sysseek( FH, $lastPos, SEEK_SET );
        sysread( FH, $ret, $pos - $lastPos, 0 );
    }
    close( FH );
    $lastPos = $pos;
    return $ret;
}

textSinceLast();

`systemctl reload httpd`; # or "service restart apache2", or whatever your distro wants

for( my $i=0 ; $i<1000 ; ++$i ) { # give up after 10sec
    select( undef, undef, undef, 0.01 ); # apparently a tricky way of sleeping for 10ms
    my $text = textSinceLast();
    if( $text =~ /resuming normal operations/ ) {
        print "Detected restart on $i\n";
        last;
    }
}

información relacionada