为什么logrotate每次都会导致Apache发生故障?

每次运行logrotate Apache / 2.4.7(Ubuntu)遇到seg故障并且不会重新启动:

 [Wed Sep 10 06:35:54.266018 2014] [mpm_event:notice] [pid 20599:tid 140630283466624] AH00493: SIGUSR1 received. Doing graceful restart [Wed Sep 10 06:35:54.885118 2014] [core:notice] [pid 20599] AH00060: seg fault or similar nasty error detected in the parent process 

我的apache logrotate脚本如下所示:

 /var/log/apache2/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate /usr/sbin/apachectl graceful endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript } /srv/apache/log/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate /usr/sbin/apachectl graceful endscript prerotate if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi; \ endscript } 

我将默认日志保存在/var/log/apache2 ,但是我在/srv/apache/log目录中保留了特定于虚拟主机的日志(对于这个服务器托pipe的三个不同的虚拟主机)(例如mysite1_error.logmysite1_access.logmysite2_error.logmysite2_access.log ….)。

/etc/apache2/apache.conf的相关部分:

 #/etc/apache2/apache.conf ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel trace8 # I set to try and get more info about this problem. LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent 

其中export APACHE_LOG_DIR=/var/log/apache2$SUFFIX 。 在我的虚拟主机conf文件,如/etc/apache2/sites-enabled/mysite1.conf我有:

 #/etc/apache2/sites-enabled/mysite1.conf LogLevel debug ErrorLog /srv/apache/log/mysite1_error.log CustomLog /srv/apache/log/mysite2_access.log combined 

和其他网站类似。

任何人都知道为什么logrotate导致这个崩溃?

还有一件事:

手动强制root用户login:

 logrotate -v -f /etc/logrotate.d/apache2 

不会导致seg错误,但是我知道这是logrotate,因为我已经尝试了与时间(每周,每天)的玩法,并且seg故障总是恰好发生在仅仅旋转日志的时候。

如何按需复制

 # Set a crontab to run each minute (simulating cron.daily run of logrotate) crontab -e */1 * * * * root /usr/sbin/logrotate -v -f /etc/logrotate.d/apache2 > /home/myuser/logrotate.log 2>&1 

最后

如果我在/etc/logrotate.d/apache注释掉/srv/apache/log/*.log旋转块,seg故障也不会发生。

看来,如果我只是将logrotate脚本更改为单个块,即/var/log/apache2/*.log, /srv/apache/logs/*.log {....}我不明白段错误。 所以这只是两个块在第一次重启期间导致第二次重启尝试…

如果我inputapache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & cmd线我的系统确实段错误,这似乎证实