web-dev-qa-db-ja.com

なぜlogrotateが毎回Apacheにフォルトを発生させるのですか?

logrotateを実行するたびにApache/2.4.7(Ubuntu)でセグメンテーション違反が発生し、再起動しません。

[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に保持していますが、vhost固有のログ(このサーバーでホストされている3つの異なるvhosts)を/srv/Apache/logディレクトリ(例:mysite1_error.logmysite1_access.log)に保持しています。 、mysite2_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/etc/Apache2/sites-enabled/mysite1.confなどのvhost 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がこのクラッシュを引き起こしている理由を誰かが知っていますか?

もう1つ:

Rootとしてlogrotateを手動で強制します。

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

segフォールトは発生しませんが、時間(週、日)を試してみたところ、ログがローテーションしていることがわかります。また、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

最終的に

/srv/Apache/log/*.log/etc/logrotate.d/Apacheローテーションブロックをコメント化すると、セグフォールトも発生しません。

15
fpghost

Logrotateスクリプトを1つのブロックに変更しただけでは、/var/log/Apache2/*.log, /srv/Apache/logs/*.log {....} segfaultを取得できないようです。つまり、最初の再起動中に2つのブロックが2回目の再起動を引き起こしているだけでした...

コマンドラインにApache2ctl graceful & Apache2ctl graceful & Apache2ctl graceful & Apache2ctl graceful &と入力すると、システムはsegfaultを実行します。

13
fpghost