Servermonitoring mit der Bash

Veröffentlicht von Administrator am Jan 20 2020
Computer »
Da mich Onlineversionen von Monitoring bisher nicht zufrieden gestellt haben, haben ich nun ein bash-Script erstellt, welches
mir die Erreichbarkeit der Dienste prüft und bei Nichterreichbarkeit eines (oder mehrerer ) Dienstes eine Nachricht aufs Handy
schickt. Mal ehrlich? Wer schaut schon mehrfach auf diversen Webseiten nach ob alle Dienste eines Servers auch wirklich
laufen? Ich habe zwar auch munin als Monitoring auf allen meinen Servern laufen aber dort schaue ich 1-2 mal pro Woche
vorbei oder halt im Fehlerfall. Ich habe also eine Möglichkeit gesucht, die mir die Dienste auf Erreichbarkeit prüft und im
Fehlerfall eine Nachricht an mein Handy schickt.
Für den Versand habe ich mich für Telegram entschieden, da hier das Senden von Nachrichten einfach und kostenlos erfolgt.
Wie man Nachrichten per Telegram versendet habe ich an dieser Stelle erklärt.
Darum habe ich ein kleine s Bashscript gebaut welches leicht um jeden möglichen Dienst erweitert werden kann.
Dieses Script wird im Homeverzeichnuis des Users "root" unter dem Namen server-monitoring.sh gespeichert und mit
chmod +x /root/server-monitoring.sh
ausführbar gemacht.
#!/bin/bash

#Alle Ausgaben in eine Datei schreiben
exec &> /root/monitoring.log


#einige Vars
TOKEN="hier den Telegram-TOKEN rein"
ID="Hier die Telegram Chat_id"
HOSTNAME=$(hostname -f)
DATE="$(date +"%d.%b.%Y--%H:%M")"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"

echo "Monitoring auf $HOSTNAME"
echo $DATE

#monitoring
APACHE=$(ps auwx | grep "/usr/sbin/apache2" | grep -v -c grep)
if [ $APACHE -gt 0 ]
then echo "Apache ist o.k."
else echo "Apache NICHT O.K. !!!!"
fi

SSH=$(ps auwx | grep "sshd" | grep -v -c grep)
if [ $SSH -gt 0 ]
then echo "SSHD ist o.k."
else echo "SSHD NICHT O.K. !!!!"
fi

MYSQL=$(ps auwx | grep "/usr/sbin/mysqld" | grep -v -c grep)
if [ $MYSQL -gt 0 ]
then echo "MYSQL ist o.k."
else echo "MYSQL NICHT O.K. !!!!"
fi

MUNIN=$(ps auwx | grep "munin-node" | grep -v -c grep)
if [ $SSH -gt 0 ]
then echo "MUNIN ist o.k."
else echo "MUNIN NICHT O.K. !!!!"
fi

FAIL2BAN=$(ps auwx | grep "fail2ban-server" | grep -v -c grep)
if [ $FAIL2BAN -gt 0 ]
then echo "FAIL2BAN ist o.k."
else echo "FAIL2BAN NICHT O.K. !!!!"
fi

POSTFIX=$(ps auwx | grep "/usr/lib/postfix/master" | grep -v -c grep)
if [ $POSTFIX -gt 0 ]
then echo "POSTFIX ist o.k."
else echo "POSTFIX NICHT O.K. !!!!"
fi

#CPU
CPU=$(top -n 1 -b | grep "%Cpu(s):" | gawk '{ printf ("%.0f",
 100-$8) }')
CPU=$(printf "%.f" $CPU )
if [ $CPU -lt 50 ]
then echo "CPU Auslastung ist bei $CPU %"
else echo "CPU Auslastung ist bei $CPU NICHT O.K. !!!!"
fi

#uptime
UPTIME=$(gawk '{ printf ("%.0f",
 $1/86400) }' /proc/uptime)
if [ $UPTIME -gt 0 ]
then echo "Uptime seit "$UPTIME "Tagen "
else echo "SERVER Neustart NICHT O.K. !!!!"
fi

#Mem
MEM_MAX=$(free |grep "Mem" | /usr/bin/gawk '{print $2/1024}')
MEM_USED=$(free |grep "+" | /usr/bin/gawk '{print $3/1024}')
MEM_FREE=$(free |grep "+" | /usr/bin/gawk '{printf "%.f",
 $4/1024}')
if [ $MEM_FREE -gt 500 ]
then echo "Freier SPEICHER "$MEM_FREE "MB"
else echo "SPEICHER fast voll " $MEM_FREE " MB frei NICHT O.K. !!!!"
fi

#Disk
DISKFREE=$(df |grep "/dev/sda2" | /usr/bin/gawk '{printf "%.f",
 $4/1024/1024}')
DISKUSED=$(df |grep "/dev/sda2" | /usr/bin/gawk '{print $3/1024/1024}')
#echo "genutzterPlatz: "$DISKUSED" GB "
if [ $DISKFREE -gt 5 ]
then echo "Freier Plattenplatz "$DISKFREE "GB"
else echo "Festplatte fast voll " $DISKFREE " GB frei NICHT O.K. !!!!"
fi

MESSAGE=$(cat /root/monitoring.log)


# send message if a service ist nor available
if [ `echo $MESSAGE | grep -c "NICHT" ` -gt 0 ]
then
curl -s -X POST $URL -d chat_id=$ID -d text="$MESSAGE" >/dev/null
fi

 

Gehen wir das Script einmal durch:
in Zeile 4 werden alle Ausgaben, die in diesem Script erstellt werden, in eine Datei geschrieben.
Ich habe diesen Weg gewählt, da ich so immer auf den letzten Durchlauf zugreifen kann.
Danach werden ein paar Variablen erstellt wie z.B. der Hostname und das Datum, sowie auch die
nötigen Sachen um alles per Telegram zu versenden.
Damit das Script auf mehreren Servern laufen kann, muss auch der Server identifizierbar sein.
Darum wir der Hostname und das Datum mit ins Log aufgenommen.
Danach folgt das eigentlich Monitoring incl. der Prüfung der Festpalttengrösse.
hier kann jeder Dienst eingetragen werden der überprüft werde soll.
Am Ende wird dann eine Nachricht versendet, falls ein Dienst nicht erreichbar/offline ist.
Sollten alle Dienste erreichbar sein, wird keine Nachricht versendet.
Damit alles automatisiert ablaufen kann wird ein cronjob erstellt. In meinem Fall
reicht eine Prüfung alle 5 min. Für kritische Server kann der Cronjob auch auf minütliche Prüfung eingestellt werden.
Wir erstellen also folgenden Cronjob mit
crontab -e

 

*/5 * * * * /root/monitoring.sh

 

Ihr bekommt im Fehlerfall somit in wenigen Sekunden eine Nachricht auf euer Handy.

Zuletzt geändert am: Jan 20 2020 um 3:23 PM

Zurück zur Übersicht
Kein Kommentar gefunden

Kommentar hinzufügen