logrotateが毎回Apacheにセグメンテーション違反を引き起こすのはなぜですか?


15

logrotateApache / 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.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/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がこのクラッシュを引き起こしている理由を誰でも知っていますか?

もう一つ:

logrotateをルートとして手動で強制する:

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

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

最後に

segフォールトの/srv/apache/log/*.logローテーションブロックをコメントアウトすると、/etc/logrotate.d/apacheどちらも発生しません。


攻撃/usr/sbin/apachectl graceful者のように見えるエラーメッセージを形成します(理論的には/etc/logrotate.d/httpd-prerotate内のスクリプトも候補です)。/usr/sbin/apachectl graceful手動で実行して確認できますか?これがApacheのグローバルエラーログ(またはグローバルsyslog)で発生する場合、おそらく<VirtualHost>内だけでなくグローバルにLogLevelを増加させる場合のヒントはありますか?
ニルストートマン14

/usr/sbin/apachectl gracefulcmd行で手動で問題が発生することはありません(また、この行は元々/etc/init.d/apache2 reload > /dev/nullあったが、segフォールトを取得した後、apachectlオンラインで読んだアドバイスに変更したことに注意してください。明らかに問題は修正されませんでした)。LogLevelはすでにファイル内でtrace8設定された可能な限り高いレベルにありapache.confます。
fpghost 14

そしてそれを除外するために:/etc/logrotate.d/httpd-prerotate存在しません。
fpghost 14

これは通常、モジュールが適切にシャットダウンされないことが原因です。エキゾチックなモジュールを使用していますか?最近追加されたものはありますか?サードパーティのモジュール?それらを無効にしてみてください。
ジョヴァンニティルローニ14

それでは/usr/sbin/apachectl graceful、logrotateによって発行された場合にセグメンテーション違反を引き起こしていますが、手動で発行された場合ではありませんか?奇数
ニルストートマン14

回答:


13

logrotateスクリプトを単一のブロックに変更するだけの場合、つまり /var/log/apache2/*.log, /srv/apache/logs/*.log {....}セグメンテーション違反は発生しないようです。だから、最初の再起動中に2つのブロックが2回目の再起動を試みていた...

apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &cmd行に入力すると、私のシステムはセグメンテーション違反を起こします。


1
この正確な問題はありますが、logrotateスクリプトの最初のブロックは1つだけです。何か案は?
kontextify
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.