Ich überwache Hunderte von dedizierten und virtuellen Servern mit dem folgenden Skript:
#!/bin/bash
PATH=/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
threshold=90
serverip=$($(which ifconfig) | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1)
memused=$(free | awk '/Mem/{printf("RAM Usage: %.2f%\n"), $3/$2*100}' | awk '{print $3}' | cut -d"." -f1)
if [ "$memused" -gt "$threshold" ]
then
CTIME=$(date +%Y-%m-%d-%H%M%S)
ps aux > /root/.example/logs/lowmem-"${CTIME}"-ps.log
top -n 1 -o %MEM -c > /root/.example/logs/lowmem-"${CTIME}"-top.log
free -m > /root/.example/logs/lowmem-"${CTIME}"-free.log
mysqladmin proc -v status > /root/.example/logs/lowmem-"${CTIME}"-mysqlproc.log
bash /example/general/slack.sh "#server-alerts" ":warning: $(hostname) - ${serverip} - Memory Usage has reached 90% - Check logs /root/.example/logs/lowmem-${CTIME} \n \`\`\`$(head -1 /root/.example/logs/lowmem-"${CTIME}"-free.log) \n $(head -2 /root/.example/logs/lowmem-"${CTIME}"-free.log | tail -1) \n $(tail -1 /root/.example/logs/lowmem-"${CTIME}"-free.log)\`\`\`"
crontab -l | grep -v '/example/mon_mem.sh' | crontab -
sleep 900
crontab -l | { cat; echo "* * * * * bash /example/mon_mem.sh"; } | crontab -
fi
Obwohl es in den meisten Fällen funktioniert, erhalten wir zufällig falsche Positivmeldungen. Es sind völlig zufällige Server und es ist nicht bei jedem Server konsistent, sodass ein Server möglicherweise auslöst, aber dann nie wieder (fälschlicherweise).
Beispiel für ein falsches Positiv:
total used free shared buff/cache available
Mem: 2048 345 1580 27 122 1674
Swap: 2048 0 2048
Von diesem Server ist eine Warnung eingegangen, aber Sie können sehen, dass nur 345 MB verwendet wurden.
Antwort1
3 Probleme:
Sie rufen
free
zweimal an: einmal fürAuslösungdie Warnung, einmal zum Senden des Berichts. Die Zahlen haben sich in der Zwischenzeit geändert. Speichern Sie die Ausgabe (in einer Variablen) und rufen Sie dieselben Daten zweimal ab."Verwendeter Speichersollennähert sich der Gesamtspeichermenge, und "frei" sollte immer gegen Null gehen. Wenn SieungebrauchtSpeicher, das bedeutet, dass Sie Ressourcen verschwendet haben, die zwar nicht zugewiesen sind, aber zumindest als Caches dienen sollten.
Ich empfehle Ihnen, die
memused
Zeile zu ändern, die derzeit die zweite mit der dritten Spalte vergleicht ($3/$2
), sodass stattdessen die erste mit der letzten Spalte verglichen wird.Bei Ihrer Methode zur Nachrichtenübermittlung scheint die Formatierung verloren zu gehen. Überprüfen Sie Ihre Übermittlungsmethode (slack.sh), um Ihre Eingabe in Monospace wiederzugeben, oder ersetzen Sie Tabulatoren und Leerzeichen durch entsprechende Abstandshalter.
So sollte die Tabelle aussehen:
gesamt gebraucht frei geteilt Buff/Cache verfügbar Speicher: 2048 345 1580 27 122 1674 Tauschen: 2048 0 2048 DerfünfZahlen beginnen mit dem "Gesamt"-Speicher, und wenn überhaupt, diezuletztDie Nummer ist diejenige, die Sie interessieren sollte.