Определить, когда постепенная перезагрузка Apache завершена

Определить, когда постепенная перезагрузка Apache завершена

Похоже, Apache graceful reload (apachectl graceful) — асинхронная операция. Если я вызову ее из скрипта, скрипт продолжит работу, пока Apache будет выполнять свою работу, что может занять неопределенное количество времени (например, медленные клиенты, долгая загрузка).

Я хотел бы программно определить, когда перезагрузка завершена и Apache теперь работает с новой конфигурацией. Другими словами, я хотел бы найти способ обрабатывать это как синхронный вызов, который продолжается только после завершения Apache.

Как бы вы это сделали на моем месте?

Добавлено 12/09: Похоже, что Apache перезапускает неактивные потоки с новой конфигурацией, но потоки с открытыми соединениями сохраняют старую конфигурацию до тех пор, пока соединение не будет разорвано. Так что, возможно, вопрос можно было бы задать более точно об определении того, когда Apache начинает принимать новые соединения с новой конфигурацией.

решение1

Думаю, мне нужно решить свою собственную проблему...

Вот кусок Perl, который я придумал. По сути, я нахожу конец файла журнала Apache и запоминаю его. Затем я запускаю перезапуск/перезагрузку Apache и смотрю, какой текст был записан в файл журнала с тех пор. Если текст содержит «возобновление нормальной работы», я считаю, что перезапуск/перезагрузка завершены. (Я не уверен, что это правда, но похоже на это со страницы Apache «Остановка и перезапуск» здесь:http://httpd.apache.org/docs/2.2/stopping.html)

Улучшения приветствуются.

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

Связанный контент