Inicio de sesión


Reiniciant automàticament l'apache i la base de dades quan al servidor es queden processos penjats


La web de guifi.net i comesfa.org va creixent en nombre de visitants de forma important. Entre això i les visites dels robots (google, msn...) i altres no tan benvingudes (web-spammers que busquen forats per penjar publicitat), hi ha estones que el servidor rep una bona castanya. Si a això hi afegim que al servidor s'hi fan alhora desenvolupaments de forma contínua..., doncs hi ha processos que s'arriben a penjar, requerint llavors que es reinicii l'apache, i fins que no es reinicia, doncs no funciona la web Sad (m'estic referint a un error que haureu vist alguna vegada i que diu "too many connections").

Evidentment la solució correcta és evitar que aquestes penjades es produeixin, tanmateix tots sabeu que tot i que potser no és el cortrecte, arrivat a un punt fer una drecera amb un pegat, també pot ser una bona solució. Un cop coneixem els símptomes de l'aturada i per tal d'aconseguir que de forma desassistida el servidor es recuperi, podem posar un script que detecti quan s'estan produint aquestes penjades, i de forma automàtica reinicii els serveis. Si això ho posem en un cron, per exemple cada 5 minuts, aconseguirem que el servidor es "neteji" tot solet i la penjada no vagi més enllà de 5 minuts...

L'script en qüestió seria el següent:

#!/bin/bash
TOOMANY=`ps -ef |grep "/usr/sbin/httpd" | grep -v grep | wc -l`
if [ 50 -le ${TOOMANY} ]
then
  echo "`date` Too many apache procs (${TOOMANY})... restarting apache and mysql"
  # paro l'apache
  /sbin/service httpd stop
  # mata els processos (de vegades encara en queden)
  for p in `ps -ef |grep "/usr/sbin/httpd" | grep -v grep| cut -c9-14`
  do
    echo "Killing process ${p}"
    kill -9 $p
  done
  # paro el mysql
  /sbin/service mysqld stop
  # deixa respirar el servidor, recuperar el swap...
  sleep 10
  # reinicia mysql i apache
  /sbin/service mysqld start
  /sbin/service httpd start
fi

Això és per un Fedora, en altres Linux els canvis no haurien pas de ser gaire importants.
En el cron, hi posem que redirigeixi la sortida cap a /var/log/toomany.log i d'aquesta manera tindrém enregistrat quan s'estan produint aquestes reinicialitzacions.