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