Специальный файл, который хранит только последние n строк

Есть ли способ создать специальные файлы в Linux, которые будут хранить только, скажем, 100 последних написанных строк? У меня есть процесс, заполняющий файл журнала, и я хотел бы регулярно анализировать его 100 последних строк.

Я знаю, что мог бы использовать какой-то вид logrotate, но есть ли способ создать специальный файл, который будет заполняться до тех пор, пока он не достигнет 100 строк, а затем, добавив строку, удалит самую старую, так что файл будет содержать только 100 строк? (вид линейного FIFO)

большое спасибо

3 ответа

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

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

Файловые системы не подготовлены для этого (по крайней мере, я не слышал об этом типе), поэтому журналирование logrotate/tail/database-backed используется там, где важны последние записи.

Разрабатывая метод Jarmunds, вы можете создать скрипт bash, например:

while true; do 
    tail -n 100 somefile.log > onlylast100lines.log
    sleep 5
done

это будет анализировать последние 100 строк somefile.log в onlylast100lines.log каждые 5 секунд. Файл будет перезаписываться каждый раз, поэтому всегда будут только последние 100 строк. Это может быть добавлено в ваш сценарий входа в систему или на любой уровень запуска, который вы хотите, чтобы это выполнялось.

Предполагая, что у вас есть сценарий, который обрабатывает только последние 100 строк при каждом его запуске, эти строки лучше всего захватывать с помощью tail команда, так как она делает в значительной степени то, что вы хотите сделать. Ключ здесь -n переключатель, который определяет, сколько строк он должен захватить, начиная с конца.

Вы можете принять участие tail -n 100 somefile.log в вашем скрипте напрямую, или вы можете периодически запускать tail -n 100 somefile.log > onlylast100lines.log создать файл только с последними 100 строками. Последний подход будет перезаписывать целевой файл каждый раз, поэтому нет необходимости удалять его между каждым запуском.

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