Подтвердить что ты не робот

Как использовать хвост для просмотра файла журнала, который часто воссоздается

Мне нужно решение для создания script, чтобы закрепить файл журнала, который воссоздан (с тем же именем) после достижения определенного размера.

Использование "tail -f" заставляет хвост останавливаться, когда файл воссоздан/повернут.

Что я хотел бы сделать, так это создать script, который закроет файл и после него, например, до 100 строк, а затем перезапустит команду... или даже лучше перезапустить команду при воссоздании файла? что-то вроде этого возможно?

Спасибо!

4b9b3361

Ответ 1

Да! Используйте это (повтор будет выполнять повтор хвоста, если файл не существует или в противном случае недоступен, а не просто сбой - например, когда вы меняете файлы):

tail -f --retry <filename>

ИЛИ

tail --follow=name --retry

ИЛИ

tail -F <filename>

Ответ 2

попробуйте запустить

watch "tail -f" yourfile.log

Ответ 3

Если tail -F доступен не, и вы пытаетесь восстановить его из logrotate, вы можете добавить опцию copytruncate в свой файл спецификации logrotate.d/, чтобы вместо создания нового файла каждый раз после вращения файл сохраняется и усекается, а копия поворачивается.

Таким образом, старый дескриптор файла продолжает указывать на новый файл журнала (truncated), в который добавляются новые журналы.

Обратите внимание, что во время этого процесса copy-truncate может быть некоторая потеря данных.

Ответ 4

Так как у вас нет хвоста, который поддерживает все функции, и поскольку у вас нет часов, вы можете использовать простой script этот цикл бесконечно для выполнения хвоста.

#!/bin/bash 

PID=`mktemp`
while true;
do
  [ -e "$1" ] && IO=`stat -c %i "$1"`
  [ -e "$1" ] && echo "restarting tail" && { tail -f "$1" 2> /dev/null & echo $! > $PID; }

  # as long as the file exists and the inode number did not change
  while [[ -e "$1" ]] && [[ $IO = `stat -c %i "$1"` ]]
  do
     sleep 0.5
  done
  [ ! -z $PID ] && kill `cat $PID` 2> /dev/null && echo > $PID
  sleep 0.5
done 2> /dev/null
rm -rf $PID

Возможно, вы захотите использовать ловушку, чтобы выйти из этого script. Это зависит от вас.

В основном, этот script проверяет, изменилось ли число inode (с помощью stat -c %i "$1"), чтобы убить команду tail и начать новую, когда файл воссоздается.

Примечание: вы можете избавиться от echo "restarting tail", который будет загрязнять ваш вывод. Это было полезно только для тестирования. Также могут возникнуть проблемы, если файл будет заменен после проверки номера inode и перед запуском хвостового процесса.