Detectar quando a recarga graciosa do Apache estiver concluída

Detectar quando a recarga graciosa do Apache estiver concluída

Parece que o Apache Graceful Reload (apachectl Graceful) é uma operação assíncrona. Se eu invocá-lo a partir de um script, o script continuará enquanto o Apache faz seu trabalho, o que pode levar um tempo indeterminado (por exemplo, clientes lentos, downloads longos).

Gostaria de detectar programaticamente quando a recarga for concluída e o Apache estiver sendo executado com a nova configuração. Em outras palavras, eu gostaria de encontrar uma maneira de tratá-lo como uma chamada síncrona que só continua quando o Apache é concluído.

Como você faria isso se fosse eu?

Adicionado em 12/09: parece que o Apache reinicia threads ociosos com a nova configuração, mas threads com conexões abertas mantêm a configuração antiga até que a conexão termine. Então, talvez a pergunta pudesse ser feita com mais precisão sobre como determinar quando o Apache começa a aceitar novas conexões com a nova configuração.

Responder1

Acho que preciso resolver meu próprio problema...

Aqui está um pedaço de Perl que eu criei. Basicamente, encontro o final do arquivo de log do Apache e o memorizo. Em seguida, emito uma reinicialização/recarga do Apache e vejo qual texto foi gravado no arquivo de log desde então. Se o texto contiver "retomando as operações normais", considero que a reinicialização/recarga foi concluída. (Não tenho certeza se isso é verdade, mas parece que está na página do Apache em "Parando e Reiniciando" aqui:http://httpd.apache.org/docs/2.2/stopping.html)

Melhorias apreciadas.

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

informação relacionada