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).
Links
Programme
Beispiele
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