====== Inotify ======
[[wp>Inotify]] ist ein [[linux:Kernel]]-Subsystem das Dateiänderungen überwacht und diese an Anwendungen meldet. Es ist als Ersatz für dnotify seit [[linux: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 =====
* [[http://www.ende-der-vernunft.org/2006/02/02/mit-inotify-das-dateisystem-ueberwachen/|Mit inotify das Dateisystem überwachen]]
* [[http://www.ende-der-vernunft.org/2006/08/10/mit-inotify-das-dateisystem-ueberwachen-teil-2/|Mit inotify das Dateisystem überwachen – Teil 2]]
* [[http://www.linux-magazin.de/Ausgaben/2007/03/Unter-der-Lupe|Verzeichnisse überwachen mit Iwatch]]
===== Programme =====
* [[http://inotify.aiken.cz/|Incron]] - behandelt Dateisystem-events
* [[http://sourceforge.net/projects/iwatch/|iWatch]]
===== 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