LINUX.ORG.RU

tail -f и grep -m в скрипте

 , , ,


0

1

Привет!

Есть приложение, которое в свой лог-файл постоянно пишет очень много инфы о своей работе. Также у этого приложения есть конфиг, который этот приклад постоянно проверяет - если конфиг изменился, то он перечитывается приложением, и инфа о статусе этой операции (ОК\неОК) тоже заносится в этот лог-файл.

Сейчас я руками изменяю конфиг и параллельно смотрю лог, вылавливая сообщение об обработке конфига. Теперь вопрос - как мне запихнуть это в скрипт? tail -f logfile | grep -m 1 status не помогает - даже после того как греп отловил нужную строку он не завершается. Скопировать предварительно кусок файла тоже не очень хороши вариант - могу просто не угадать нужное кол-во строк - в логи валится постоянно очень много инфы. С другой стороны копирование тоже приемлемый вариант, потому что я хочу еще в логах отловить строчки с новыми параметрами в конфиге, а через tail -f | grep -m мне это сделать не удастся.

В общем что посоветуете в этой ситуации? Заранее спасибо!!

★★★★★

Могу предложить посмотреть в сторону inotify: грепать по файлу после записи.

Или простой цикл наподобии:

while true ; do
    if grep -qm 1 status $logfile ; then
        # сделать что там надо
        break
    else
        # подождать еще
        sleep 1
    fi
done

KennyMinigun ★★★★★
()

как вариант в цикле проверять каждые, например, 0,5 секунд на изменение и реагировать вслучае изменения

teod0r ★★★★★
()
Ответ на: комментарий от Frakhtan-teh

Не стандартный пакет, не желательно

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Проверять логфайл? Можешь сниппет какой-нибудь показать?

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

Могу предложить посмотреть в сторону inotify: грепать по файлу после записи.

Ну тут я знаю что сразу после изменения конфига информация польется в лог.

Или простой цикл наподобии:

О, это отличный вариант, спасибо огромное! Единственное что мне нужно грепать не с начала файла.

alozovskoy ★★★★★
() автор топика
Последнее исправление: alozovskoy (всего исправлений: 3)

даже после того как греп отловил нужную строку он не завершается.

Скармливай по одной строке. tail ... | (while read line; do grep ...; done)

anonymous
()
tail -n 0 -f /tmp/rrr | grep -m 1 "status"

завершится после первой строки содержащей status попавшей в grep И ПОПАДАНИЯ В /tmp/rrr чего то еще (тупо echo «» >> /tmp/rrr помогает, не понимаю этого поведения но работает)

Deleted
()
Ответ на: комментарий от Deleted

И правда работает!! Спасибо огромное!!

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Правда прибьёт все остальные tail'ы.

Не, это не подойдет. Можно, конечно, пид нужного tail'a отловить но это еще большие загоны.

alozovskoy ★★★★★
() автор топика
Ответ на: комментарий от unclear

У меня не добавляет.

А про то что ты писал что не отваливается tail - если потом сделать echo another_string >> filename то отваливается.

alozovskoy ★★★★★
() автор топика
Последнее исправление: alozovskoy (всего исправлений: 1)
Ответ на: комментарий от alozovskoy

У меня не добавляет.

Как я понимаю, если в лог будет добавлена 1 строка с status, отвисание tail будет зависить от того как данные добавляются в лог, построчно или по одному символу.

echo another_string >> filename

Тогда оно добавит лишний another_string в filename.

unclear
()
Ответ на: комментарий от unclear

Тогда оно добавит лишний another_string в filename.

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

Как я понимаю, если в лог будет добавлена 1 строка с status, отвисание tail будет зависить от того как данные добавляются в лог, построчно или по одному символу.

В любом случае скорее всего нужен какой-то символ после искомого паттерна (или строка).

alozovskoy ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.