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