아파치의 우아한 재로드가 완료되면 탐지 (apachectl graceful) 비동기

그것은 아파치 우아한 reload (apachectl graceful) 비동기 작업 나타납니다. 스크립트에서 스크립트를 호출하면 아파치가 그 일을 처리하는 동안 스크립트가 계속 실행됩니다. 예를 들어 느린 클라이언트, 긴 다운로드 등 시간이 오래 걸릴 수 있습니다.

재로드가 완료되고 Apache가 새로운 구성으로 실행 중일 때 프로그래밍 방식으로 감지하고 싶습니다. 즉, 일단 아파치가 완료되면 동기화 호출과 같이 처리하는 방법을 찾고 싶습니다.

네가 나라면 어떻게 할거야?

12/09 추가됨 : 아파치는 새로운 구성으로 유휴 스레드를 다시 시작하지만 열려있는 연결을 가진 스레드는 연결이 종료 될 때까지 이전 구성을 유지합니다. 그래서 아마도 아파치가 새로운 설정으로 새로운 연결을 수락하기 시작할 때를 결정하는 것에 대해 더 정확하게 질문 할 수 있습니다.



답변

내 문제를 풀어 줘야 겠어.

여기에 내가 생각해내는 Perl 조각이있다. 기본적으로 아파치 로그 파일의 끝을 찾아 암기합니다. 그런 다음 Apache 재시작 / 재로드를 실행하고 이후로 어떤 텍스트가 로그 파일에 기록되었는지 확인합니다. 텍스트에 “정상 작동 재개”가 포함되어 있으면 다시 시작 / 다시로드가 완료된 것으로 간주됩니다. (나는 그것이 사실인지 모르겠다. 그러나 아파치 페이지의 “Stopping and Restarting”( 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;
    }
}


답변