В предыдущей работе я не мог получить надежного наблюдателя с помощью только команды fu, поэтому у меня был скрипт-обертка, подобный приведенному ниже, который проверял файл каждые секунды poll_duration и выискивал новые строки для интересующей фразы.
#!/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
Это было на Unix-машине. В Linux вы можете сделать это лучше, используя интерфейс inotify filewatcher. Если этот пакет (inotify-tools в Ubuntu) присутствует, замените
sleep $poll_duration
с
inotifywait -e modify "$file" 1>/dev/null 2>&1
Этот вызов блокируется, пока файл не будет изменен. Версия с блокировкой почти так же эффективна, как и версия с tail -f
если pipe можно настроить для работы без буферизации.
Примечание . Сценарий сначала выполняет head --lines=$new_linecount
чтобы гарантировать, что строки, добавленные в файл после того, как мы проверили его, не искажают фрагмент файла, который проверяется в этом цикле.