В CSS мы можем каскадировать свойства по иерархии, но не в противоположном направлении. Чтобы изменить родительский стиль в дочернем событии, вероятно, используйте jQuery.
$el.closest('.parent').css('prop','value');
Похоже, что проблема, с которой вы столкнулись, состоит в том, что расчеты синхронизации внутри вашего цикла 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, поэтому я использовал строчные имена переменных.
Чтобы развить свою идею, было бы полезно запустить часть 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
Как насчет чего-то простого, например:
sleep "$threshold"
grep -q 'PATTERN' "$log_file" && { echo "Clear"; exit; }
echo "Error"
Если это не все, что вам нужно, отредактируйте свой вопрос, чтобы уточнить ваши требования. Не используйте весь верхний регистр для неэкспортированных имен переменных оболочки, кстати, - Google.
Это выглядит как сторожевой таймер. Я реализовал что-то вроде этого, заставив фоновый процесс обновить мой журнал, поэтому мне не нужно беспокоиться о 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 или выше.