Shellscript для мониторинга файла журнала, если ключевое слово срабатывает, а затем выполняет команду?

Есть ли дешевый способ отслеживать файл журнала, например tail -f log.txt, а затем, если появится что-то вроде [error], выполнить команду?

Спасибо.


person est    schedule 02.12.2010    source источник


Ответы (4)


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

tail -fn0 logfile | awk '/pattern/ { print | "command" }'

Это выполнит команду, когда шаблон будет найден в журнале. Команда может быть любой командой unix, включая сценарии оболочки или что-то еще.

person user420783    schedule 19.04.2013

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

person Ari Maniatis    schedule 14.07.2013

Лучше и проще:

tail -f log.txt | egrep -m 1 "error"
echo "Found error, do sth."
...
person Changbin Du    schedule 26.07.2017
comment
Спасибо за этот фрагмент кода, который может оказать немедленную помощь. Надлежащее объяснение значительно повысило бы его образовательную ценность, показав, почему это хорошее решение проблемы, и сделает его более полезным для будущих читателей с похожими, но не идентичными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются. - person Toby Speight; 26.07.2017

person    schedule
comment
о, еще одна вещь, срок действия tail -fn0 logfile, похоже, истек, поскольку файл журнала HTTP-сервера быстро переименовывается и сжимается gzip. Думаю, скрипт по-прежнему отслеживает старый файловый дескриптор? Есть ли способ автоматического обновления файла inode или чего-то еще через некоторое время для команды tail? - person est; 10.12.2010
comment
Просто добавьте --retry к команде tail или используйте -F вместо -f. Это должно сработать. - person Zizzencs; 14.12.2010
comment
Также рассмотрите grep -q, чтобы установить код возврата без отображения совпадающих строк. - person Adam Liss; 14.07.2013
comment
проблема в том, что такие журналы, как catalina,out (apache), имеют историю, поэтому готовые шаблоны уже существуют. есть ли способ проверить только будущие журналы? - person Siddharth; 30.05.2017