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

В CSS мы можем каскадировать свойства по иерархии, но не в противоположном направлении. Чтобы изменить родительский стиль в дочернем событии, вероятно, используйте jQuery.

$el.closest('.parent').css('prop','value');
2
задан vijesh 29 March 2019 в 10:55
поделиться

4 ответа

Похоже, что проблема, с которой вы столкнулись, состоит в том, что расчеты синхронизации внутри вашего цикла while никогда не имеют шансов на запуск, когда read блокирует вход. В этом случае вы можете направить вывод tail в цикл while true, внутри которого вы можете сделать if read -t $timeout:

log_file=/tmp/app.log
threshold=120
timeout=10

tail -Fn0 "$log_file" | while true; do
  if read -t $timeout line; then
    echo "${line}" | awk '/PATTERN/ { system("touch pattern.tmp") }'
  fi

  # code to calculate how long ago pattern.tmp touched and same is assigned to diff 

  if [ ${diff} -gt ${threshold} ]; then
    echo "Error"
  else
    echo "Clear"
  fi
done

Как отметил Эд Мортон, все имена переменных caps не являются хорошая идея в скриптах bash, поэтому я использовал строчные имена переменных.

0
ответ дан Mike Holt 29 March 2019 в 10:55
поделиться

Чтобы развить свою идею, было бы полезно запустить часть awk в фоновом режиме и выполнить непрерывный цикл для проверки.

#!/usr/bin/env bash

log_file="log.txt"
# threshold in seconds
threshold=10

# run the following process in the background
stdbuf -oL tail -f0n "$log_file" \
   | awk '/PATTERN/{system("touch "pattern.tmp") }' &

while true; do
    match=$(find . -type f  -iname "pattern.tmp" -newermt "-${threshold} seconds")
    if [[ -z "${match}" ]]; then
        echo "Error"
    else
        echo "Clear"
    fi
done
0
ответ дан kvantour 29 March 2019 в 10:55
поделиться

Как насчет чего-то простого, например:

sleep "$threshold"
grep -q 'PATTERN' "$log_file" && { echo "Clear"; exit; }
echo "Error"

Если это не все, что вам нужно, отредактируйте свой вопрос, чтобы уточнить ваши требования. Не используйте весь верхний регистр для неэкспортированных имен переменных оболочки, кстати, - Google.

0
ответ дан Ed Morton 29 March 2019 в 10:55
поделиться

Это выглядит как сторожевой таймер. Я реализовал что-то вроде этого, заставив фоновый процесс обновить мой журнал, поэтому мне не нужно беспокоиться о read -t. Вот рабочий пример:

#!/usr/bin/env bash

threshold=10
grain=2

errorstate=0

while sleep "$grain"; do
        date '+[%F %T] watchdog timer' >> log
done &
trap "kill -HUP $!" 0 HUP INT QUIT TRAP ABRT TERM

printf -v lastseen '%(%s)T'
tail -F log | while read line; do
        printf -v now '%(%s)T'
        if (( now - lastseen > threshold )); then
                echo "ERROR"
                errorstate=1
        else
                if (( errorstate )); then
                        echo "Recovered, yay"
                        errorstate=0
                fi
        fi
        if [[ $line =~ .*PATTERN.* ]]; then
                lastseen=$now
        fi
done

Запустите это в одном окне, подождите $threshold секунд для его запуска, затем в другом окне echo PATTERN >> log, чтобы увидеть восстановление.

Хотя это может быть сделано как угодно детально (в примере я установил его на 2 секунды), это загрязняет ваш лог-файл.

Да, и обратите внимание, что для формата printf '%(%s)T' требуется bash версии 4 или выше.

0
ответ дан ghoti 29 March 2019 в 10:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: