Назад | Перейти на главную страницу

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

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

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

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

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

watch -n 1 cat filename

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

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

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

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

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

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


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

Бедняк watch:

while true
do
    clear
    cat file
    sleep 1
done

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

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

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

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