Detectar quando o recarregamento normal do Apache estiver concluído

2

Parece que o recarregamento gracioso do Apache (apachectl gracioso) é uma operação assíncrona. Se eu invoco de um script, o script continuará enquanto o Apache faz a sua coisa, o que pode levar um tempo indeterminado (por exemplo, clientes lentos, downloads longos).

Gostaria de detectar programaticamente quando o recarregamento estiver concluído e o Apache agora estiver executando com a nova configuração. Em outras palavras, gostaria de encontrar uma maneira de tratá-lo como uma chamada síncrona que só continua depois que o Apache é concluído.

Como você faria isso se fosse eu?

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

    
por Johannes Ernst 07.12.2013 / 06:28

1 resposta

1

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

Aqui está um pedaço de Perl que eu inventei. Basicamente, eu encontro o final do arquivo de log do Apache e o memorizo. Em seguida, emito um reinício / recarregamento do Apache e vejo qual texto foi gravado no arquivo de log desde então. Se o texto contiver "retomar as operações normais", considero que o reinício / recarga tenha sido concluído. (Não tenho certeza se isso é verdade, mas parece que está na página do Apache em "Parando e Reiniciando" aqui: link )

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;
    }
}
    
por 09.12.2013 / 23:50