Handmatig periodiek je logfiles, geheugen- en diskruimte controleren, of alle processen nog draaien etc. kost heel veel tijd en is niet te doen.

Om dit te automatiseren, gebruiken we een paar door mezelf gemaakte BASH scripts en LogWatch voor de logfiles.

LogWatch

LogWatch is een goede tool om automatisch een overzicht te genereren. Dit overzicht kan bekeken worden op de commandline, maar in onderstaand artikel gaan we dagelijks een mail versturen.

Logwatch is als volgt te installeren:

$ apt-get install logwatch

Nu kun je al LogWatch aanroepen, waarmee je een compeet overzicht in tekst op de commandline krijgt:

$ logwatch

Als je LogWatch elke dag een email met de status wilt laten versturen, doe je het volgende:

$ vi /usr/share/logwatch/default.conf/logwatch.conf

En wijzig de volgende parameters in deze file:

Output = mail
Format = html
MailTo = me@example.com
MailFrom = root@example.com

Logwatch hoeft niet aan crontab te hoeven toegevoegd, hij staat al automatisch in cron.daily.

Het server_check script

Het server_check script heb ik gemaakt nadat er door een tekort aan geheugen een van de processen gecrasht was. Onderstaand script zorgt ervoor dat de kritische processen elke minuut gecheckt worden of ze nog draaien en worden gestart als dit niet zo is. Ook krijg je direct een email notificatie.

$ vi /usr/local/sbin/server_check
#!/bin/bash

MAIL=mijn@mailadres.nl
LOGFILE=/var/log/server_status.log

function restart-service {
  echo "" >> $LOGFILE
  echo Status before restarting $1 >> $LOGFILE
  free >> $LOGFILE
  echo "$(date): Restarting $1" >> $LOGFILE
  /usr/sbin/service $1 restart >> $LOGFILE 2>&1
  echo Status after restarting $1 >> $LOGFILE
  free >> $LOGFILE
  cat $LOGFILE | /usr/bin/mail -s "['$(hostname -f)] $1 process crashed and started" $MAIL
}

pidof /usr/sbin/mysqld >/dev/null
if [[ $? -ne 0 ]] ; then
 restart-service mysql
fi

pidof /usr/sbin/nginx >/dev/null
if [[ $? -ne 0 ]] ; then
 restart-service nginx 
fi

pidof php5-fpm >/dev/null
if [[ $? -ne 0 ]] ; then
 restart-service php5-fpm
fi

pidof /usr/lib/postfix/master >/dev/null
if [[ $? -ne 0 ]] ; then
 restart-service postfix
fi

pidof /usr/sbin/saslauthd >/dev/null
if [[ $? -ne 0 ]] ; then
 restart-service saslauthd
fi

pidof /usr/sbin/opendkim >/dev/null
if [[ $? -ne 0 ]] ; then
 restart-service opendkim
fi

Het server_status script

Het tweede script wat ik gemaakt gemaakt heb, is eenvoudig diverse server checks naar een logfile, en deze wordt dagelijks gemaild. Als je nog commando’s wilt toevoegen, kun je dat eenvoudig zelf doen.

$ vi /usr/local/sbin/server_status
#!/bin/bash

MAIL=mijn@mailadres.nl
LOGFILE=/var/log/server_status.log

$ params
$ $1 = command
$ $2 = Description
function get-status {
echo "" >> $LOGFILE
echo "$2 (command: $1)" >> $LOGFILE
$1 >> $LOGFILE
}

echo "" >> $LOGFILE
echo "++++++++++ Server status +++++++++" >> $LOGFILE
echo "" >> $LOGFILE

get-status "df -h"              "+++DiskStatus"
get-status "uptime"             "+++Serverload"
get-status "apt-get -s upgrade" "+++Updates available?"
get-status "vmstat"             "+++System Activity, Hardware and System Inform
ation"
get-status "w"                  "+++Who's logged in and what are the doing?"
#get-status "ps -A"             "+++Which processes are running?"
get-status " free -m"           "+++Free memory"

echo "" >> $LOGFILE
echo "+++Forwarded emails (without all root@ emails)" >> $LOGFILE
grep "$(date --date '-1 days' +'%b %e')" /var/log/mail.log?? | egrep 'postfix/qmgr|postfix/smtp' | egrep ' from=<| to=<'|cut -d' ' -f-4,6,8,14|awk -v nlines=1 '/ from=<root@cloud.example.com>/ {for (i=0; i<nlines; i++) {getline}; next} 1' >> $LOG_FILE 2>&1


# Mail and delete the server_status.log file of today, for a fresh log tomorrow
cat $LOGFILE | /usr/bin/mail -s "['$(hostname -f)] daily server status" $MAIL

echo "" > $LOGFILE
echo "+++++ Crashed/Restarted processes ++++" >> $LOGFILE
echo "" >> $LOGFILE

Toevoegen van de scripts aan de crontab

Het volgende toevoegen aan crontab om periodiek te scripts uit te voeren:

$ crontab -e
*/1 * * * * /usr/local/sbin/server_check > /dev/null 2>&1
5 19 * * * /usr/local/sbin/server_status > /dev/null 2>&1

De gids “VPS opzetten” bestaat uit de volgende artikelen: