Это выглядит для меня как сторожевой таймер.Я реализовал нечто подобное, заставив фоновый процесс обновить мой журнал, поэтому мне не нужно беспокоиться о 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 или выше.