Существует ли эквивалент `tail -f` для случая, когда файл перезаписывается (а не добавляется)?

Как постоянно контролировать файл, который постоянно перезаписывается? В частности, файл содержит одну строку текста, которую фоновый процесс многократно открывает и переписывает.

Я надеялся, что tail -F будет работать, но это не так.

Обновление: я надеялся, что это не будет уместно, но я использую Mac OS X 10.5.8.

5 ответов

Решение

Вы можете использовать watch, чтобы повторить выполнение команды, так что в вашем случае

watch -n 1 cat filename

Есть лучшие способы сделать это, но это сработает

  while true ; do echo -n "`date +%s:` " >> file.log ; cat file >> file.log  ; done 

Файл file.log будет расти... быстро...

Если вам нужно больше возможностей, например, чтобы проверить, совпадает ли содержимое файла с предыдущим, вы можете развернуть его в сценарий. Просто прокомментируйте ниже, и я помогу.

Бедняк watch:

while true
do
    clear
    cat file
    sleep 1
done

Изменить cat если файл длиннее экрана, например:

tail -n $((LINES - 4)) file

Вы можете добавить условные выражения для проверки изменения временной метки файла и т. Д.

На системах BSD (и я верю большинству других систем) tail -f вернется к началу файла, если увидит, что файл был усечен (это звучит как поведение, которое вы хотите).

В системах Linux происходит то же самое, но, по крайней мере, на поле Debian, которое у меня лежит вокруг tail, есть "интервал опроса", так что вам нужно сказать, чтобы он не спал между проверками файла (tail -s 0 -f ...) чтобы он заметил усечение, в противном случае происходят странные вещи (если файл того же размера или меньше, когда он записан, вы не получаете вывод, если он больше, вы получаете все после текущего маркера подсчета байтов tail и т. д. - Play) с имплементацией своего хвоста, чтобы посмотреть, как он себя ведет)


В качестве альтернативы как для Linux, так и для BSD систем хвост имеет -F вариант (который как -f но проверяет, был ли файл повернут - т.е. имя указывает на другой номер инода). Это не поможет вам, если файл будет обрезан, а не удален и заменен.

Вы можете использовать API-интерфейс FSEvents и небольшой скрипт для мониторинга файла (или, точнее, каталога, в котором находится файл).

Другие вопросы по тегам