2011-12-27 3 views
15

У меня есть каталог, полный файлов журналов, которые я хотел бы использовать в качестве хвоста.Tailing Rolling Files

Файлы названы такие:

name  modified 
00A.txt Dec 27 19:00 
00B.txt Dec 27 19:01 
00C.txt Dec 27 19:02 
00D.txt Dec 27 19:03 

На старой системе UNIX, я пытаюсь придумать сценарий оболочки, который будет хвост наиболее недавно измененный файл в определенном каталоге, и если этот файл становится административно закрытым (перекатывается к следующему файлу). Я хочу, чтобы программа автоматически начинала обрабатывать новый файл без необходимости выходить из хвоста для повторного запуска.

tail -100f `ls -t | head -1` 

Желаемое поведение, учитывая вышеупомянутые имена файлов, будут идти, как это:

./logtailer.sh 

Затем скрипт начнет хвостовых 00D.txt. Как только регистратор завершил запись в 00D.txt, и новый файл журнала теперь был назван 00E.txt, программа автоматически начнет обрабатывать этот файл.

Можно написать этот скрипт, просмотрев вывод хвоста для текста «Файл с административным закрытием», а затем снова выполнив следующую команду.

tail -100f `ls -t | head -1` 

Есть ли более элегантный способ сделать это, чем смотреть текст «файл административно закрыт»? Как я могу прочитать вывод хвоста за строкой в ​​сценарии оболочки?

Редактировать: Я должен объяснить, что флагом -F для хвоста не является вариантом для меня в этой системе. Он использует другую версию хвоста, которая не содержит эту функцию. Версия ОС - Solaris 10

ответ

19

Вы можете использовать опцию -F для tail, что подразумевает --follow=name --retry.

С man страницы:

-F  
The -F option implies the -f option, but tail will also check to see if the 
file being followed has been renamed or rotated. The file is closed and 
reopened when tail detects that the filename being read from has a new inode 
number. The -F option is ignored if reading from standard input rather than 
a file. 
+0

Я хотел бы использовать этот флаг, но моя версия у хвоста нет этой функции, и у меня нет возможности ее обновить. (Нет прав администратора) – user1118047

+0

Можете ли вы предоставить информацию о версии 'tail' и' box (unix/linux) ', которые вы используете? –

+1

SunOS 5.10 Не знаете, как найти версию хвоста ... – user1118047

3

вам может понадобиться inotify обнаружить создание нового файла, обходной путь для этого было бы сохранить опрашивает файловую систему во время работы хвост на фоне:

#!/bin/bash 

get_latest() { 
    local files=(*.log) 
    local latest=${files[${#files[@]}-1]} 
    echo "$latest" 
    [[ $latest == $1 ]] 
} 
run_tail() { 
    tail -c +0 -f "$1" 
} 

while true; do 
    while current=$(get_latest "$current"); do 
     sleep 1 
    done 
    [[ $pid ]] && kill $pid 
    run_tail "$current" & pid=$! 
done 

(непроверенные, unnecesarily Hacky и быть осторожными с ограничениями вашей старой системы!)

+1

Мне нравится, когда этот ответ идет ... Я не смог подключить и запустить это право в сценарий оболочки и пусть он сделает то, что я хочу, но я собираюсь поиграть с кодом здесь и посмотреть, что я могу сделать, чтобы он работал. – user1118047