Monit ist ein leicht einzurichtendes, ressourcenschonendes und äußerst Battle-getestetes Open-Source (AGPLv3) Programm, das sich Herr Vorragend als Monitoring- & Management-Lösung für Unix-Systeme eignet.
Einmal (oder wer auch mag zweimal) eingerichtet, kann Monit eine Vielzahl von Serverdiensten überwachen, einschließlich Filesystem, CPU, Speicher, Logfiles, Datei/Ordner-Veränderungen und verschiedene Protokolle wie HTTP, SMTP, FTP, LDAP, NTP, SSH, SIP, IMAP, POP, DNS usw.
Wenn z.B ein Servicedienst (Webserver, Datenbank, etc.) abkackt oder dirty Veränderungen an zu überwachenden Dateien (md5, sha1) vorgenommen werden, löst Monit einen Alarm aus (Email,Webhooks, Slack, etc.), startet den Service neu und eine verpetzende E-Mail-Benachrichtigung wird verschickt.
Ansicht – Monit Status Webinterface
Das mitgelieferte Webinterface zeigt super quick einen Überblick über das System.
Anleitung zur Installation & Konfiguration von Monit
Hier gibts ne kurze Anleitung zur Installation, Konfiguration von Monit plus ein paar Beispiel-Konfigurationen für Debian-basierte Root-Server.
Monit auf einem Debian-System installieren
apt-get update && apt-get install monit
systemctl enable monit
Monit Einrichten
# Ordner for die Eventqueues anlegen und Berechtigung setzen
mkdir /var/monit/
chown monit:monit /var/monit && chmod 750 /var/monit
Monit Hauptkonfiguration
In der Konfiguration müsste mindesten die Variable $DEINE_ZIEL_EMAIL durch die gewünschte Email ersetzt werden.
# /etc/monit/monitrc
# Ereigniswarteschlange allows Ereignisse (hier 1000) zu speichern, schrittweise abzuarbeiten plus hilft auch keine Events zu verlieren
set eventqueue basedir /var/monit/ slots 1000
# Überprüfungsintervall in Sekunden setzen. Hier Alle zwei Minuten check
set daemon 120
with start delay 240
# Monit Logfile setzen
set logfile /var/log/monit.log
# E-Mail-Server-Konfiguration für Benachrichtigungen
set mailserver 127.0.0.1
set mail-format {
from: monit@$HOST
subject: monit alert -- $SERVICE $EVENT am $DATE
message: $EVENT Service $SERVICE
Date: $DATE
Action: $ACTION
Host: $HOST
Description: $DESCRIPTION
Dein geiler True OG Admin!
}
# Do not alert when Monit start, stop or perform a user initiated action
set alert $DEINE_ZIEL_EMAIL not on { instance, action }
# Konfiguration für Status-Anzeige & Webinterface
set httpd port 2812 and
use address localhost
allow localhost
# Konfigurationen einbinden
include /etc/monit/conf.d/*.cfg
include /etc/monit/conf-enabled/*
Monit Service-Konfigurationsdatei Beispiele
Systemressourcen Überwachung
# /etc/monit/conf.d/system.cfg
# Monitoring Systemressourcen
check system $HOST
# Monitoring CPU-Auslastung
if cpu usage (user) > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
if cpu usage (system) > 36% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
if cpu usage (wait) > 20% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
if cpu usage > 200% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
# Monitoring Load Average
if loadavg (1min) > 6 for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
if loadavg (5min) > 4 for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
# Monitoring RAM-Verbrauchs
if memory usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
if swap usage > 30% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
# Checks gruppieren
group system
Monit Skript sys-monit-top-process.sh
#!/usr/bin/env bash
#==========================================================
# Autor: Hackspoiler
# URL: https://hackspoiler.de
# Scriptname: sys-monit-top-process.sh
# Scriptpath: /root/server-scripts/
# Usage: /root/server-scripts/sys-monit-top-process.sh
# Version: 0.5
# Date: 15.02.2022
# Shellcheck: True
# Package: mail
# Modification: 12.05.2023
# Descritpion: Monit Skript das bei Alerts Hostname, die Load Average und die Top 10 CPU/RAM-Verschwendert verpetzt
#==========================================================
# Set Bash-Defaults
#==========================================================
set -o errexit # Beenden, falls ein Befehl fehlschlägt (-e)
set -o nounset # Beenden, falls ungesetzte Variable exisitiert (-u)
set -o pipefail # Beenden, falls eine Pipeline fehlschlägt
# Set Variables
#==========================================================
EMAIL_SUBJECT="Top Prozesse"
EMAIL_ADDRESS="$DEINE_ZIEL_EMAIL"
# Main
#==========================================================
# Systeminformationen
FQDN=$(hostname --fqdn)
LOAD_AVERAGE=$(uptime | awk -F 'load average: ' '{print $2}')
# Prozessinformationen
CPU_OUTPUT=$(ps aux --sort=-%cpu | head -n 11)
MEM_OUTPUT=$(ps aux --sort=-%mem | head -n 11)
# Email-Inhalt
EMAIL_BODY="# FQDN des Systems
${FQDN}
# Load Average des Systems
${LOAD_AVERAGE}
# Top 10 Prozesse nach CPU-Auslastung:
${CPU_OUTPUT}
# Top 10 Prozesse nach Speicherverbrauch:
${MEM_OUTPUT}"
# Emailversand
echo -e "${EMAIL_BODY}" | mail -s "${EMAIL_SUBJECT}" "${EMAIL_ADDRESS}"
Festplattenspeicher Überwachung
# /etc/monit/conf.d/disk.cfg
# Monitoring /boot auf HDD /dev/sda1
check filesystem boot with path /dev/sda1
if space usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
if inode usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
# Monitoring (/) auf HDD /dev/mapper/root
check filesystem root with path /dev/mapper/root
if space usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
if inode usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
# Monitoring /var auf HDD /dev/mapper/var
check filesystem var with path /dev/mapper/var
if space usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
if inode usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
# Monitoring /home auf HDD /dev/mapper/home
check filesystem home with path /dev/mapper/home
if space usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
if inode usage > 86% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh"
# Checks gruppieren
group disk
Monit Skript sys-monit-disk.sh
#!/usr/bin/env bash
#==========================================================
# Autor: Hackspoiler
# URL: https://hackspoiler.de
# Scriptname: sys-monit-disk.sh
# Scriptpath: /root/server-scripts/
# Usage: /root/server-scripts/sys-monit-disk.sh
# Version: 0.5
# Date: 16.02.2022
# Shellcheck: True
# Package: mail
# Modification: 12.05.2023
# Descritpion: Monit Skript das bei Alerts Hostname, die Festplattenbelegung und Inodes verpetzt
#==========================================================
# Set Bash-Defaults
#==========================================================
set -o errexit # Beenden, falls ein Befehl fehlschlägt (-e)
set -o nounset # Beenden, falls ungesetzte Variable exisitiert (-u)
set -o pipefail # Beenden, falls eine Pipeline fehlschlägt
# Set Variables
#==========================================================
EMAIL_SUBJECT="Top Prozesse"
EMAIL_ADDRESS="$DEINE_ZIEL_EMAIL"
# Main
#==========================================================
# Systeminformationen
FQDN=$(hostname --fqdn)
LOAD_AVERAGE=$(uptime | awk -F 'load average: ' '{print $2}')
# Prozessinformationen
CPU_OUTPUT=$(ps aux --sort=-%cpu | head -n 11)
MEM_OUTPUT=$(ps aux --sort=-%mem | head -n 11)
# Email-Inhalt
EMAIL_BODY="# FQDN des Systems
${FQDN}
# Load Average des Systems
${LOAD_AVERAGE}
# Top 10 Prozesse nach CPU-Auslastung:
${CPU_OUTPUT}
# Top 10 Prozesse nach Speicherverbrauch:
${MEM_OUTPUT}"
# Emailversand
echo -e "${EMAIL_BODY}" | mail -s "${EMAIL_SUBJECT}" "${EMAIL_ADDRESS}"
Logfile Überwachung
# /etc/monit/conf.d/logfile.cfg
# Monitoring Syslog-Protokolldatei
check file syslog with path /var/log/syslog
if match "error|panic|killed" then alert
# Check, ob Logfile seit 2 Minuten nicht mehr aktualisiert wurde
if timestamp > 2 minute then alert
# Check, ob Logfile over 30MB groß ist
if size > 30 MB then alert
# Monitoring Kernen-Log-Protokolldatei
check file kernlog with path /var/log/kern.log
if match "error|panic|killed" then alert
# Gruppierung von Checks
group logfile
Fail2ban Überwachung
# /etc/monit/conf.d/fail2ban.cfg
# Monitoring Fail2ban-Dienstes
check process fail2ban with pidfile /var/run/fail2ban/fail2ban.pid
# Start/Stop Befehl für den Dienst
start program = "/bin/systemctl start fail2ban"
start program = "/bin/systemctl stop fail2ban"
# Monitoring Fail2ban-Log-Datei
if failed file "/var/log/fail2ban.log" then alert
# Nach 5 fehlgeschlagenen Restart-Versuchen Fail2ban timeouten
if 5 restarts within 5 cycles then timeout
# Gruppierung von Checks
group fail2ban
Apache-Webserver Überwachung
# /etc/monit/conf.d/apache.cfg
# Monitoring Apache-Webserver
check process apache with pidfile /var/run/apache2/apache2.pid
# Start/Stop Befehl für den Dienst
start program = "/bin/systemctl start apache2"
stop program = "/bin/systemctl stop apache2"
# Monitoring Apache-Child-Prozesse
if children > 250 for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh"
if children > 300 then restart
# Monitoring Domain hackspoiler.de auf Port 443
if failed host hackspoiler.de port 443 type tcpssl retry 3 then restart
# Monitoring Antwortzeit von https://hackspoiler.de
if failed url "https://hackspoiler.de" timeout 10 seconds for 1 cycles then restart
# Nach 5 fehlgeschlagenen Restart-Versuchen Apache timeouten
if 5 restarts within 5 cycles then timeout
# Checks gruppieren
group webserver
Mysql-Datenbank Überwachung
# /etc/monit/conf.d/mysql.cfg
# Monitoring Mysql Datenbank
check process mysqld with pidfile /var/run/mysqld/mysqld.pid
# Start/Stop Befehl für den Dienst
start program = "/bin/systemctl start mysql"
stop program = "/bin/systemctl stop mysql"
# Monitoring IP 127.0.0.1 auf Port 3306
if failed host 127.0.0.1 port 3306 protocol mysql then restart
# Nach 5 fehlgeschlagenen Restart-Versuchen Mysql timeouten
if 5 restarts within 5 cycles then timeout
# Checks gruppieren
group dbserver
NFS-Freigabe Überwachung
# /etc/monit/conf.d/nfs-mount.cfg
# Monitoring der NFS-Freigabe für Borgbackup
check filesystem nfs-share with path /mnt/backup/borg
if not mounted then exec "/usr/bin/mount -a -t nfs -o timeout=10"
# Schreibtest auf NFS-Freigabe für Borgbackup
check program nfs-write with path /root/server-scripts/sys-monit-check-nfs-write.sh
if status != 0 then alert
# Checks gruppieren
group nfs-mount
NFS-Freigabe Überwachung
#!/usr/bin/env bash
#==========================================================
# Autor: Hackspoiler
# URL: https://hackspoiler.de
# Scriptname: sys-monit-check-nfs-write.sh
# Scriptpath: /root/server-scripts/
# Usage: /root/server-scripts/sys-monit-check-nfs-write.sh
# Version: 0.5
# Date: 09.03.2023
# Shellcheck: True
# Package:
# Modification: 22.04.2023
# Descritpion: Monit Skript um Schreibzugriff auf den NFS-Mount zu checken
#==========================================================
# Variable
TEST_FILE="/mnt/backup/borg/sys-monit-check-nfs-write"
# Schreibversuch auf NFS-Freigabe
touch "${TEST_FILE}"
if [[ ${?} -eq 0 ]]; then
rm --preserve-root "${TEST_FILE}"
exit 0
else
exit 1
fi
Monit Testen
Process Matching
Zeigt alle laufenden Prozesse die Monit mit dem übergebenen RegEx-Ausdruck findet
# Syntax
monit procmatch $REGEX
monit procmatch mysql
List of processes matching pattern "mysql":
┌───┬───────┬───────┬────────────────────────────────────────────────────────────────┐
│ │ PID │ PPID │ Command │
├───┼───────┼───────┼────────────────────────────────────────────────────────────────┤
│ * │ 22825 │ 1 │ /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid │
└───┴───────┴───────┴────────────────────────────────────────────────────────────────┘
Total matches: 1
# Online RegEx Tester: https://regex101.com/
Monit überprüfen und Dienstservices starten
Monit Konfiguration testen:
monit -t
Wenn keine Fehler angezeigt werden:
systemctl restart monit
Überwachung eines Services aktivieren
Wenn ein Dienst nach einem Restart nicht automatisch aktiviert wird
# Status anzeigen lassen
monit status
# Beispielausgabe mysql
Process 'mysql'
status Not monitored
monitoring status Not monitored
# Monitoring aktivieren
monit monitor mysql
# Restarten und nocheinmal gegechecken
systemctl restart monit
monit monitor mysql
# Beispielausgabe mysql
Process 'mysql'
monitoring status Monitored
monitoring mode active
GeMONITorte Prozesse auflisten
Zeigt alle laufenden Prozesse die Monit mit dem übergebenem RegEx-Ausdruck findet:
# Syntax
monit procmatch $REGEX
monit procmatch mysql
List of processes matching pattern "mysql":
┌───┬───────┬───────┬────────────────────────────────────────────────────────────────┐
│ │ PID │ PPID │ Command │
├───┼───────┼───────┼────────────────────────────────────────────────────────────────┤
│ * │ 22825 │ 1 │ /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid │
└───┴───────┴───────┴────────────────────────────────────────────────────────────────┘
Total matches: 1
Online RegEx Tester: https://regex101.com/
Monit Status anzeigen
Nur wenn die Webschnittstelle (set httpd) aktiviert ist
monit status
monit status $DIENST
monit summary
┌─────────────────────────────────┬────────────────────────────┬───────────────┐
│ Service Name │ Status │ Type │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ tron │ OK │ System │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ mysql │ OK │ Process │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ apache │ OK │ Process │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ boot │ OK │ Filesystem │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ root │ OK │ Filesystem │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ var │ OK │ Filesystem │
├─────────────────────────────────┼────────────────────────────┼───────────────┤
│ srv │ OK │ Filesystem │
└─────────────────────────────────┴────────────────────────────┴───────────────┘
Überwachung eines Services stoppen
# Status anzeigen lassen
monit status
# Beispielausgabe mysql
Process 'mysql'
monitoring status Monitored
monitoring mode active
# Monitoring stoppen
monit stop mysql
Monit Logfile
# Logile anzeigen
tail --follow /var/log/monit.log
Monit Dokumentation
https://mmonit.com/monit/documentation/monit.html
https://mmonit.com/wiki/Monit/ConfigurationExamples