Monit ist ein leicht einzurichtendes, ressourcenschonendes und Battle-getestetes Open-Source (AGPLv3) Programm, das sich Herr Vorragend als Monitoring- und 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.
Hier gibts ne juicy Anleitung/Howto zur Installation, Konfiguration von Monit plus ein paar Beispiel-Konfigurationen für Debian-basierte Root-Server.
Monit 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
# /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_EMPFANGS_MAIL not on { instance, action } # Konfiguration für Status-Anzeige & Webinterface set httpd port 2812 and use address localhost allow localhost allow $BENUTZER:$STABILES_PASSWORT # Konfigurationen einbinden include /etc/monit/conf.d/*.cfg include /etc/monit/conf-enabled/*
Monit Service-Konfigurationsdatei Beispiele
Systemressourcen Monitoring
# /etc/monit/conf.d/system.cfg # Monitoring Systemressourcen check system $HOST # Monitoring CPU-Auslastung if cpu usage (user) > 85% for 3 cycles then exec "/root/server-scripts/sys-monit-top-process.sh" if cpu usage (system) > 35% 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-Verbrauch if memory usage > 85% 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-processes.sh
#!/usr/bin/env bash #========================================================== # Autor: Hackspoiler # URL: https://hackspoiler.de # Scriptname: sys-monit-top-processes.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 den 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 Monitoring
# /etc/monit/conf.d/disk.cfg # Monitoring /boot auf HDD /dev/sda1 check filesystem boot with path /dev/sda1 if space usage > 85% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh" if inode usage > 90% 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 > 90% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh" if inode usage > 90% 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 > 90% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh" if inode usage > 90% 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 > 90% for 3 cycles then exec "/root/server-scripts/sys-monit-disk.sh" if inode usage > 90% 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 den Hostname, die Festplattenbelegung plus 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="Oversicht Festplattenbelegung und Inodes" EMAIL_ADDRESS="$DEINE_ZIEL_EMAIL" # Main #========================================================== # Systeminformationen FQDN=$(hostname --fqdn) # Festplattenbelegung und Inodes DISK_USAGE=$(df --human-readable --exclude-type tmpfs --exclude-type devtmpfs | sort --key 2 --reverse) INODE_USAGE=$(df --inodes --human-readable --exclude-type tmpfs --exclude-type devtmpfs | sort --key 2 --reverse) # Email-Inhalt EMAIL_BODY="# FQDN des Systems ${FQDN} # Festplattenbelegung: ${DISK_USAGE} # Inode-Nutzung: ${INODE_USAGE}" # Emailversand echo -e "${EMAIL_BODY}" | mail -s "${EMAIL_SUBJECT}" "${EMAIL_ADDRESS}"
Logfile Monitoring
# /etc/monit/conf.d/logfile.cfg # Monitoring der 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 der 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 Monitoring
# /etc/monit/conf.d/fail2ban.cfg # Monitoring des 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 Monitoring
# /etc/monit/conf.d/apache.cfg # Monitoring des 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 der 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 der Domain hackspoiler.de auf Port 443 if failed host hackspoiler.de port 443 type tcpssl retry 3 then restart # Monitoring der 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 Monitoring
# /etc/monit/conf.d/mysql.cfg # Monitoring der 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 der 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 Monitoring
# /etc/monit/conf.d/nfs-mount.cfg # Monitoring der Borgbackup NFS-Freigabe 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 Borgbackup NFS-Freigabe 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
Monit Skript sys-monit-check-nfs-write.sh
#!/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 ü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 Webschnittstelle aktiv 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 -f /var/log/monit.log