Warum verursacht Logrotate, dass Apache jedes Mal einen Seg-Fehler macht?


15

Bei jedem logrotateStart von Apache / 2.4.7 (Ubuntu) tritt ein Seg-Fehler auf und es wird kein Neustart durchgeführt:

[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

Mein Apache-Logrotate-Skript sieht folgendermaßen aus:

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

Ich halte die Standardprotokolle in /var/log/apache2, aber ich halte vHost spezifische Protokolle (für die drei verschiedenen vhosts auf diesem Server gehostet) im /srv/apache/logVerzeichnis (zB mysite1_error.log, mysite1_access.log, mysite2_error.log, mysite2_access.log....).

Die relevanten Teile von /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

wo export APACHE_LOG_DIR=/var/log/apache2$SUFFIX. In meinen vhost conf-Dateien habe /etc/apache2/sites-enabled/mysite1.confich:

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

und ähnliches für die anderen Websites.

Weiß jemand, warum Logrotate diesen Absturz verursacht?

Eine Sache noch:

Manuelles Erzwingen der Logrotate als root:

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

verursacht den Seg-Fehler nicht, aber ich weiß, dass es logrotat ist, da ich versucht habe, mit den Zeiten zu spielen (wöchentlich, täglich) und der Seg-Fehler immer genau dann auftritt, wenn die Protokolle nur gedreht werden.

So reproduzieren Sie nach Bedarf

# 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

Schließlich

Wenn ich den /srv/apache/log/*.logRotationsblock /etc/logrotate.d/apacheauskommentiere, tritt der Seg-Fehler ebenfalls nicht auf.


Aus der Fehlermeldung geht hervor, dass es sich /usr/sbin/apachectl gracefulum den Täter handelt (theoretisch sind Skripte in /etc/logrotate.d/httpd-prerotate auch Kandidaten). Können Sie dies durch /usr/sbin/apachectl gracefulmanuelles Ausführen bestätigen ? Gibt es weitere Hinweise, wenn dies im globalen Apache-Fehlerprotokoll (oder im globalen Syslog) geschieht, möglicherweise, wenn Sie den LogLevel nicht nur innerhalb von <VirtualHost>, sondern global erhöhen?
— Nils Toedtmann

/usr/sbin/apachectl gracefulDie manuelle Eingabe in der Zeile cmd verursacht keine Probleme (Beachten Sie auch, dass diese Zeile ursprünglich vorhanden war, /etc/init.d/apache2 reload > /dev/nullaber nachdem ich den Seg-Fehler erhalten hatte, habe ich apachectlauf einen Rat, den ich online gelesen habe, gewechselt , offensichtlich wurden die Probleme nicht behoben). Der LogLevel ist bereits trace8in der apache.confDatei global auf den höchstmöglichen Wert eingestellt .
— fpghost

Und nur um es auszuschließen: /etc/logrotate.d/httpd-prerotateexistiert nicht.
— fpghost

Dies wird normalerweise dadurch verursacht, dass ein Modul nicht ordnungsgemäß heruntergefahren wird. Verwenden Sie exotische Module? Wurde kürzlich etwas hinzugefügt? Module von Drittanbietern? Versuchen Sie, sie zu deaktivieren.
— Giovanni Tirloni

So /usr/sbin/apachectl gracefulverursacht eine segfault , wenn sie von logrotate ausgegeben, aber nicht , wenn sie manuell ausgegeben? Odd
— Nils Toedtmann

Antworten:


13

Es sieht so aus, als ob ich, wenn ich nur das Logrotate-Skript in einen einzelnen Block ändere, den Segfault /var/log/apache2/*.log, /srv/apache/logs/*.log {....}nicht bekomme. Es waren also nur die beiden Blöcke, die beim ersten Neustart einen zweiten Neustartversuch verursachten ...

Wenn ich in apache2ctl graceful & apache2ctl graceful & apache2ctl graceful & apache2ctl graceful &die cmd-Zeile eingebe, ist mein System SEGFault, was zu bestätigen scheint


1
Ich habe genau dieses Problem, aber zunächst nur einen Block in meinem Logrotate-Skript. Irgendwelche Ideen?
— kontextify
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.