Cómo escribir un script de shell para reiniciar Apache si "el servidor alcanzó MaxClients"

Cómo escribir un script de shell para reiniciar Apache si "el servidor alcanzó MaxClients"

Recientemente, mi blog siempre se cierra, usa centos6.2+apache2.2+mysql5.5+php5.3. He subido MaxClientsen httpd.conf, pero menos útil.

Entonces, ¿es posible escribir un script de shell (ejecutar con crontab cada 10 minutos) para leer el archivo httpd/error_log, si el último mensaje preg_match sending a SIGTERMreinicia Apache automáticamente?

Respuesta1

Analizar los archivos de registro puede ser bastante complicado. En lugar de intentar hacer eso, probablemente sería mejor usar un script como este que puede ejecutarse desde una entrada de crontab. Este script intentará acceder al servidor; si no tiene éxito, reiniciará Apache.

Guion

Fuente del guión:script bash para reiniciar Apache automáticamente

#!/bin/sh
# Script that checks whether apache is still up, and if not:
# - e-mail the last bit of log files
# - kick some life back into it
# -- Thomas, 20050606

PATH=/bin:/usr/bin
THEDIR=/tmp/apache-watchdog
[email protected]
mkdir -p $THEDIR

if ( wget --timeout=30 -q -P $THEDIR http://localhost/robots.txt )
then
    # we are up
    touch ~/.apache-was-up
else
    # down! but if it was down already, don't keep spamming
    if [[ -f ~/.apache-was-up ]]
    then
        # write a nice e-mail
        echo -n "apache crashed at " > $THEDIR/mail
        date >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "Access log:" >> $THEDIR/mail
        tail -n 30 /var/log/apache2_access/current >> $THEDIR/mail
        echo >> $THEDIR/mail
        echo "Error log:" >> $THEDIR/mail
        tail -n 30 /var/log/apache2_error/current >> $THEDIR/mail
        echo >> $THEDIR/mail
        # kick apache
        echo "Now kicking apache..." >> $THEDIR/mail
        /etc/init.d/apache2 stop >> $THEDIR/mail 2>&1
        killall -9 apache2 >> $THEDIR/mail 2>&1
        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1
        # send the mail
        echo >> $THEDIR/mail
        echo "Good luck troubleshooting!" >> $THEDIR/mail
        mail -s "apache-watchdog: apache crashed" $EMAIL < $THEDIR/mail
        rm ~/.apache-was-up
    fi
fi

rm -rf $THEDIR

Caminos

Las rutas a los scripts de parada/inicio deberán ajustarse en consecuencia según dónde haya instalado Apache su distribución. Líneas como esta:

        /etc/init.d/apache2 start >> $THEDIR/mail 2>&1

Si estás en CentOS será así:

        /etc/init.d/httpd start >> $THEDIR/mail 2>&1

Nombre del ejecutable

Lo mismo ocurre con las killlalllíneas. El nombre del ejecutable en CentOS es httpd.

La entrada crontab

Este cron deberá ejecutarse como root para que tenga los permisos adecuados para detener/iniciar Apache.

información relacionada