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