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