2

Похоже, что Apache Graceful Reload (Apachectl Graceful) является асинхронной операцией. Если я вызову его из сценария, сценарий продолжится, пока Apache сделает свое дело, что может занять неопределенное количество времени (например, медленные клиенты, длительные загрузки).

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

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

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

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .