In einem früheren Job konnte ich mit nur command-fu keinen zuverlässigen Beobachter finden, daher hatte ich ein Wrapper-Skript wie das folgende, das alle poll_duration Sekunden die Datei inspizierte und die neuen Zeilen nach dem interessierten Ausdruck durchsuchte.
#!/bin/bash
file=$1
phrase=$2
poll_duration=$3
typeset -i checked_linecount
typeset -i new_linecount
typeset -i new_lines
let checked_linecount=new_linecount=new_lines=0
echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds"
while [ 1 ]
do
let new_linecount=`wc -l $file| awk '{print $1}'`
if [[ $new_linecount > $checked_linecount ]]; then
let "new_lines = $new_linecount-$checked_linecount"
head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep
let checked_linecount=$new_linecount
fi
sleep $poll_duration
done
Dies war auf einer Unix-Maschine. Unter Linux können Sie mithilfe der inotify- Filewatcher-Oberfläche eine Verbesserung erzielen. Wenn dieses Paket ( inotify-tools unter Ubuntu) vorhanden ist, ersetzen Sie es
sleep $poll_duration
mit
inotifywait -e modify "$file" 1>/dev/null 2>&1
Dieser Aufruf wird blockiert, bis die Datei geändert wurde. Die blockierende Version ist fast so effizient wie die tail -f
Version, wenn die Pipe so konfiguriert werden könnte, dass sie ohne Pufferung funktioniert.
Hinweis: Das Skript führt zunächst eine head --lines=$new_linecount
Aktion aus, um sicherzustellen, dass Zeilen, die der Datei hinzugefügt wurden, nachdem wir sie überprüft haben, den Teil der Datei, der in dieser Schleife überprüft wird, nicht verzerren.