monit

monit restartet (er kann auch jede beliebige andere Aktion ausfühern) Dienste automatisch wenn bestimmte Konditionen zutreffen, wie z.B. der daemon läuft amok und frisst CPU oder Speicher, die systemlast im allgemeinen ist zu hoch, er stirbt ganz einfach, eine (z.B. Konfig) Datei ändert sich oder ein anderer Dienst wird durchgestartet von dem der jeweilige abhängt uvm. und leistet so u.a. einen guten Beitrag zur hochverfügbarkeit. Nebenbei lässt es sich noch als IDS „mißbrauchen“ da es timestamps und checksummen von Dateien überwachen kann.
Über jede Aktion informiert monit per mail, was manchmal unnötig/ungewollt ist. Diese Notifizierung kann man aber abschalten!

 

HP: https://mmonit.com/monit/

Aus gegebenem Anlass das abschalten der mailnotifies vor dem installieren/konfigurieren.
Es gibt insesamt drei Möglichkeiten:
1. In der /etc/aliases folgenden Eintrag vorzunehmen: monit: „/dev/null“ und als alertmail monit@localhost zu setzen
2. Bei „set mailserver“, in der Hauptkonfig, einen nicht funktionierenden/antwortenden Mailserver eintragen. Z.B. „localhost 250“
3. Die Option „noalert mail@addresse“

 

Installation:
Per Paketmanager yum/yast/zypper/apt-get monit, BSD-Ports:/usr/ports/sysutils/monit oder händisch:
# cd /usr/local/src
/usr/local/src # wget https://mmonit.com/monit/dist/monit-5.2.3.tar.gz
/usr/local/src # tar xzf monit-5.2.3.tar.gz
/usr/local/src # cd monit-5.2.3
/usr/local/src/monit-5.2.3 # ./configure && gmake && gmake install && gmake clean
/usr/local/src/monit-5.2.3 # mkdir /usr/local/etc/monit.d

Startscript:
/usr/local/src/monit-5.2.3 # vim /usr/local/etc/rc.d/monit

#!/bin/sh

case "$1" in
start)
        /usr/local/bin/monit -c /usr/local/etc/monit.conf
;;
stop)
        kill `cat /var/run/monit.pid`
;;
reload)
        kill -HUP `cat /var/run/monit.pid`
;;
restart)
        $0 stop
        $0 start
;;
*)
        echo "Usage: $0 {start|stop|reload|restart}"
        exit 1
;;
esac

 

Konfiguration:
# vim /usr/local/etc/monit.conf

#PID File
set pidfile /var/run/monit.pid

# Statefile
set statefile /var/run/monit.state

# Logfile
set logfile syslog facility log_local7

# Check every minute
set daemon 60

# Mailserver to use for alert-mails
# By default monit will drop the event alert, in the case that there is no mailserver available.
set mailserver localhost

# Andere Absendeaddresse, als die default monit@
#set mail-format { from: monitialert@server.futzelnet.de }

# Wer soll die alertmails bekommen (kann man für jeden event auch einzeln setzen)
set alert admin@futzelnet.de

# Einzele services/deamons in einzelnen dateien zwecks übersichtlichkeit
include /usr/local/etc/monit.d/*

# chmod 600 /usr/local/etc/monit.conf

Beispiel Konfigs
# vim /usr/local/etc/monit.d/tomcat

# check process
check process tomcat with pidfile /var/run/tomcat.pid
        # howto start und stop
        start program = "/etc/init.d/tomcat start"
        stop program  = "/etc/init.d/tomcat stop"
        # restart wenn kein connect auf localhost port 8080 möglich
        if failed host localhost port 8080
        # Alarmiere wenn für 5 cycles (checktime=60 => 60*5=300 sekunden == 5 minuten)
        # die CPU bei mehr als 80% ist
        # Bei 90% restart
        if cpu > 80% for 5 cycles then alert
        if cpu > 90% for 5 cycles then restart
        # Restart wenn der Speicherverbrauch mehr als 900MB ist
        if totalmem > 900 MB then restart
        # Alarmiere wenn die 5minuten load average mehr als 20 ist
        if loadavg(5min) > 20.0 for 10 cycles then alert
        # Wenn mehr als 500 child prozesse sind restart
        if children > 500 then restart
        # Wenn innerhalb 15 cycles mehr als 3 restarts nötig waren ignoriere diesen dienst zukünftig
        # Reaktivierbar mittels "monit monitor tomcat"
        if 3 restarts within 15 cycles then unmonitor
        # oder
        if 3 restarts within 15 cycles then timeout
        # Der Webserver braucht eine Mysql als backend
        # Immer wenn mysql restartet wird der service (tomcat) auch gerestartet
        depends on mysqld
        # Keine Alarme an folgende Mailaddresse
        noalert admin@futzelnet.de

# Für MySQL
# als dependency für den tomcat
check process mysqld with pidfile /var/run/mysql.pid
        start program = "/etc/init.d/mysql start"
        stop program  = "/etc/init.d/mysql stop"
        # Restarte mysql wenn sie weder auf unix socket noch per tcp antwortet
        if failed unixsocket /var/tmp/mysql.sock then restart
        if failed port 3306 then restart

# vim /usr/local/etc/monit.d/apache

# check process
check process apache with pidfile /var/run/apache.pid
        # howto start und stop
        start program = "/etc/init.d/apache start"
        stop program  = "/etc/init.d/apache stop"
        # restart wenn kein connect auf localhost port 8080 möglich
        if failed host localhost port 80
        # Alarmiere wenn für 5 cycles (checktime=60 => 60*5=300 sekunden == 5 minuten)
        # die CPU bei mehr als 80% ist
        # Bei 90% restart
        if cpu > 80% for 5 cycles then alert
        if cpu > 90% for 5 cycles then restart
        # Restart wenn der Speicherverbrauch mehr als 900MB ist
        if totalmem > 900 MB then restart
        # Alarmiere wenn die 5minuten load average mehr als 20 ist
        if loadavg(5min) > 20.0 for 10 cycles then alert
        # Wenn mehr als 500 child prozesse sind restart
        if children > 500 then restart

# check file
check file vhosts.conf with path /etc/apache/conf
        # Wenn sich die vhosts.conf (z.B. ein neuer host dazu gekommen/gelöscht oder geändert)
        # geändert hat dann restarte den webserver
        if changed timestamp then exec "/etc/init.d/apache graceful"
        # Alarmiere wenn die filepermissions nicht mehr 640 sind
        if failed permission 640 then alert
        # Alarmiere auch wenn uid/gid nicht mehr www und wwwrun sind
        if failed uid www then alert
        if failed gid wwwrun then alert
        # Wenn die checktime recht kurz ist, wie hier mit 60 sekunden, kann man
        # die pollzeit/checkzeit für einzelne checks auch verlängern
        # Hier erweitern wir die checkzeit von 60 auf 300 (60*5 = 300)
        every 5 cycles

# check host
# Wenn localhost nicht antwortet, oder wenn eine checkdatei sich verändert hat
# dann alarmiere
check host checkhost with address localhost
        if failed port 80 protocol http
        and request "/monittestpage.txt"
        with checksum 995e2794c618ab35b2aa04dee2025b1a
        then alert

# vim /usr/local/etc/monit.d/clamav

# check process
check process clamd with pidfile /var/run/clamd.pid
        # howto start und stop
        start program = "/etc/init.d/clamd start"
        stop program  = "/etc/init.d/clamd stop"
        # Stop bei einer load von 20
        if loadavg(5min) > 20.0 for 10 cycles then stop
        # Restart wenn die load unter 5 und der clamd nicht mehr auf dem socket
        # antwortet (also vorher z.B. durch monit gestoppt wurde)
        if loadavg(15min) < 5.0 for 5 cycles
        and failed unixsocket /var/tmp/clamd.sock then restart
        # Wenn innerhalb 60 cycles mehr als 3 restarts nötig waren ignoriere diesen dienst zukünftig
        # Reaktivierbar mittels "monit monitor clamd"
        if 3 restarts within 60 cycles then timeout
        # Keine Alarme an folgende Mailaddresse
        noalert admin@futzelnet.de
        # Dafür alarme an den postmaster
        alert postmaster@futzelnet.de

---

# vim /usr/local/etc/monit.d/network
---

check host checkhost with address your.default.router.ip
        # Restarte netzwerk wenn defaultrouter nicht erreichbar
        start program = "/etc/init.d/network start"
        stop program  = "/etc/init.d/network stop"
        if failed icmp type echo count 5 with timeout 10 seconds then restart

# vim /usr/local/etc/monit.d/ids

# Wildcards wie * oder ? funktionieren leider nicht!
check file shadow with path /etc/shadow
        # failed: datei kann und darf sich NICHT ändern, neuer Wert wird NICHT gespeichert
        # alarme werden weiter getriggert.
        if failed SHA1 checksum then alert

check file bash with path /bin/bash
        # checksum erzeugt, beim monit-start, keine checksumme sondern übernimmt den wert der bei expect angegeben ist
        if failed SHA1 checksum
        and expect the sum 07bbdbc5d487eea94e621d56dbe3c8472bc3c202
        then exec "/sbin/halt -f"

check file httpd2 with path /usr/sbin/httpd2
        # changed: datei kann und darf sich ändern, neuer Wert wird gespeichert
        # es gibt nur EINEN alert
        if changed timestamp then alert

Das ganze kann man jetzt für postfix, exim, sendmail, oracle, postgress, jboss, bind, tinydns, inn, diablo, mount points … und was es sonst so alles an services gibt weiterspinnen.

Für Weitergehendes, wie u.a die integration von monit in heartbeat cluster oder device monitoring usw., sei die hervorragende manpage empfohlen