Хвостовые катящиеся файлы - PullRequest
15 голосов
/ 27 декабря 2011

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

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

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 для текста «Файл административно закрыт», а затем снова запустить следующую команду.

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

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

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

Ответы [ 2 ]

19 голосов
/ 27 декабря 2011

Вы можете использовать опцию -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.
3 голосов
/ 28 декабря 2011

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

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

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

...