WedX - журнал о программировании и компьютерных науках

Как мы можем сделать ТАЙМЕР с функциональностью (СБРОС) в bash

Я очень новичок в написании сценариев оболочки, я много чего гуглил для этой проблемы. Но не могу найти идеального решения.

Проблема в том, что это код мониторинга журнала с «ОШИБКОЙ», шаблон Как мы можем создать ТАЙМЕР в сценариях unix. Поддержка У меня есть таймер на 5 минут, и время продолжает уменьшаться каждую секунду. Поэтому я хочу снова сбросить таймер на 5 минут при определенном условии (скажем, частота возникновения ошибки $FREQUENCY больше, чем, скажем, для ex2).

#!/usr/bin/env bash
PATTERN='ERROR'
TIMER=300
FREQUENCY=2

while true;
do grep -i $PATTERN logfile > tmp_log

while [ $TIMER -gt 0 ]
do
  sleep 1 &
  printf "  $TIMER \r" &
  TIMER=$[$TIMER-1];
  wait

done

if [[ $(wc -l <tmp_log) -ge $FREQUENCY ]]
        then
            TIMER=300
            echo $TIMER
fi

 sleep $TIMER
done
03.04.2017

  • Вам нужно сбросить, когда частота ошибки пересекает определенное значение. Исправь меня? 03.04.2017
  • @AshishK Да, вы правы. Когда она превышает определенную частоту, сбросьте ее. 03.04.2017
  • вам также нужно очистить tmp_log после сброса? Как я понимаю, это очень нужно. 03.04.2017

Ответы:


1
#!/bin/bash

PATTERN='ERROR'
TIMER=300
FREQUENCY=2

while true
do
        while [ $TIMER -gt 0 ]
        do
                sleep 1
                TIMER=$((TIMER - 1))
                grep -i $PATTERN logfile > tmp_log
                count=`wc -l tmp_log | awk '{ print $1 }'`
                if [ $count -gt $FREQUENCY ]
                then
                        TIMER=300
                fi
        done
        break
done

Это хорошо для вашего случая.

03.04.2017
  • вам также нужно очистить tmp_log после сброса? Как я понимаю, это очень нужно. 03.04.2017
  • Да, но, думаю, я так и сделаю....Таймер и ТАЙМЕР разные? 03.04.2017
  • Нет, извините за это .. Оба одинаковы .. Я исправил это :) 03.04.2017
  • Не подскажете где именно?? 03.04.2017
  • Если вы ждете 5 минут, пока файл (файл журнала) будет состоять из шаблона «ОШИБКА» меньше заданного количества раз (здесь частота), это сработает. Однако таймер будет повторно инициализироваться на 5 минут каждый раз, как только счетчик превысит частоту. Поэтому я спрашивал, должен ли счетчик повторно инициализироваться каждый раз, когда таймер повторно инициализируется? 03.04.2017
  • У вас есть внешний цикл while true, но последним оператором в его теле является break и нет раннего продолжения. Этот цикл бесполезен, так как он будет выполняться только один раз. 03.04.2017
  • Кроме того, каждую секунду вы выполняете grep tmp_log, но этот файл никогда не записывается после исходного grep (который сам выполняется только один раз, потому что внешний цикл выполняется только один раз. Результат будет одинаковым каждый раз, поэтому, если ваше условие выполняется на тест count против frequency вы всегда будете сбрасывать таймер. 03.04.2017
  • @fred, разрыв в конце не выполняет цикл один раз. Он используется для завершения бесконечного времени, если количество совпадений 'ERROR' меньше $frequency в течение отведенного периода времени. Область действия повторяется внутри while [ $TIMER -gt 0 ] после входа в цикл while true. 03.04.2017
  • Я предполагал, что файл журнала, из которого нужно извлечь шаблон, готов, и одна команда извлечет все шаблоны 'ERROR' одновременно. Однако после того, как вы указали на это, я чувствую, что оператор grep должен быть внутри второго цикла while с >, чтобы продолжать проверять в реальном времени, обновляется ли файл журнала во время процесса. 03.04.2017
  • @AshishK Посмотрите внимательно на свои циклы, вы увидите, что, как только первая итерация внешнего цикла завершится, break приведет к завершению цикла, гарантируя, что он никогда не зациклится. 03.04.2017
  • @AshishK Ваш подход к этой проблеме очень неэффективен. Вы должны отслеживать файл журнала (например, с помощью tail -F) и обрабатывать его вывод построчно, в то время как в отдельном процессе вы бы sleep 300. Два процесса будут обмениваться сигналами (kill), чтобы указать сброс или завершение. Это совсем другой способ программирования решения, но он позволит избежать опроса и уменьшить дрейф таймера (из-за времени, необходимого для выполнения ваших операторов, 300 итераций займут больше времени, чем 300 секунд). 03.04.2017
  • @fred вы правы, как только он завершится, то есть через 300 секунд (если количество ОШИБОК в файле меньше частоты $). Я запускаю приведенный выше код в своей системе, помещая текстовый файл с двумя счетчиками ошибок. Скрипт остается активным в течение 300 секунд. 03.04.2017
  • @fred спасибо, что указали на это. tail -f будет лучшим подходом. Я попробую решить эту проблему с помощью предложенного вами подхода. Однако контекст вопроса был еще не ясен. Я попытался закодировать сценарий так, как я понял. Однако то, что вы указали, сломало меня, так как оно не ломало первый цикл после одной итерации. 03.04.2017
  • Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]