Как я могу использовать утилиту tail для просмотра файла журнала, который часто воссоздается - PullRequest
20 голосов
/ 26 июля 2011

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

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

Я хотел бы создать скрипт, который бы следил за файлом и, например, после того, как он достигнет 100 строк, затем перезапустить команду ... Или еще лучше перезапуститькоманда когда файл воссоздается?

Возможно ли это?

Ответы [ 4 ]

20 голосов
/ 26 июля 2011

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

tail -f --retry <filename>

OR

tail --follow=name --retry

OR

tail -F <filename>
2 голосов
/ 19 декабря 2013

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

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

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

2 голосов
/ 26 июля 2011

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

watch "tail -f" yourfile.log
0 голосов
/ 26 июля 2011

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

#!/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

Возможно, вы захотите использовать trap для чистого выхода из этого скрипта. Это зависит от вас.

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

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

...