Существует ли эквивалент `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 и небольшой скрипт для мониторинга файла (или, точнее, каталога, в котором находится файл).