检测 Apache 优雅重新加载何时完成

检测 Apache 优雅重新加载何时完成

Apache 优雅重载 (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;
    }
}

相关内容