Skip to main content

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.
Bild Webinterface Monit - Unix Monitoring und Service Management Tool

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