Inotify

Inotify ist ein Kernel-Subsystem das Dateiänderungen überwacht und diese an Anwendungen meldet. Es ist als Ersatz für dnotify seit Kernel 2.6.13 standardmäßig enthalten.

Diese Aktionen sind überwachbar:

Aktion Bedeutung
access Zugriff auf Datei
modify Dateiänderung
attrib Dateiattribute wurde verändert
close_write Datei geschlossen, nachdem sie im schreibmodus geöffnet wurde
close_nowrite Datei geschlossen, nachdem sie im Nur-lese-modus geöffnet wurde
close Datei geschlossen, egal in welchem Modus
open Datei wurde geöffnet
move Eine Datei im beobachtetem Verzeichnis wurde verschoben
create eine Datei im beobachtetem Verzeichnis wurde erstellt
delete eine Datei im beobachtetem Verzeichnis wurde gelöscht
delete_self die beobachtete Datei selbst wurde gelöscht
unmount das Dateisystem die die beobachtete Datei enthält wurde ausgehangen (umounted)

Die maximale Anzahl überwachbarer Objekte (pro Benutzer) steht in /proc/sys/fs/inotify/max_user_watches (Standard: 8192).

Beobachtet Änderungen in einem Verzeichnis

Aufruf: ./watch-dir.sh VERZEICHNIS

#!/bin/sh
 
dir="$1"
 
while { inotifywait -e modify -e close_write -e create "$dir"; }; do
 
        # echo "/bin" | mail -s "Change in $dir" root
	echo Änderung im Verzeichnis "$dir"
done

Änderungen in der letzten Zeile der Datei finden

Sende eine E-Mail an root@domain.tld wenn in der letzten Zeile der Datei /var/logs/error.log die Zeichenkette „ALARM“ steht.

#!/bin/sh
 
file="/var/logs/error.log"
empfaenger="root@domain.tld"
 
while { inotifywait -e modify "$file"; }; do
	if { tail -n 1 "$file" | grep "ALARM"; }; then
		echo "ALARM gefunden" | mail -s "Betreff ALARM gefunden" $empfaenger
	fi
done

inotify-daemon Beispiel

Prüft ob nur eine Instanz des Scripts läuft und führt Aktion (hier eine e-Mail) aus wenn Änderung erfolgt.

#!/bin/sh
 
file="/srv/www/logs/error.log"
email="root"
 
PIDFILE="/var/run/INOTIFY.pid" # change!
 
 
# check if running - stolen from dhcpd3 initscript
check_status()
{
    if [ ! -r "$PIDFILE" ]; then
        test "$1" != -v || echo "$0 is not running."
	touch "$PIDFILE"
        return 0
    fi
    if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then
        test "$1" != -v || echo "$0 is running."
        return 1
    else
        test "$1" != -v || echo "$0 is not running but PIDFILE $PIDFILE exists."
        return 0
    fi
}
 
#exit if $0 is running
check_status || exit
 
# write my new PID to PIDFILE
echo $$ > "$PIDFILE"
 
while { inotifywait -e modify "$file"; }; do
	if { tail -n 1 "$file" | grep "Suchbegriff"; }; then
		echo "Suchbegriff gefunden" | mail -s "Betreff - Suchbegriff gefunden" $email
	fi
done