Файл мониторинга bash с хвостом, включая возможность динамического переключения файла? - PullRequest
1 голос
/ 18 октября 2019

У меня есть скрипт, который построчно отслеживает файл журнала и отправляет значения, полученные в другом месте (например, в графическое приложение). Однако имя файла журнала и / или путь могут измениться около полуночи, например, из-за ротации журнала app (не ротация журнала Unix) и процедуры EOD приложения. Например, файл журнала в /path/to/log/20191018/log.txt может переключиться на /path/to/log/20191019/log.txt

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

tail -f "$file" | while read line
do case "$line" in
        *"a_string"*) do_something 
         ;;
        ...
        ...
    esac
done

1 Ответ

0 голосов
/ 18 октября 2019

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

Я обычно предпочитаю механизмы «уведомления», а не механизмы «опроса», поэтому чистым решением этой проблемы было бы то, чтобы механизм ротации журналов перезапускал ваш скрипт при изменении файла. Если вы используете logrotate и имеете право изменять его конфигурацию, это можно сделать, просто добавив запись postrotate в соответствующий файл конфигурации:

/path/to/monitored/directory {
    ...
    postrotate
        /usr/bin/killall myscript
        /path/to/myscript
    endscript
}
...