Я пытаюсь улучшить монитор, который читает файл журнала и отправляет уведомление, если приложение перестало работать и регистрируется. Чтобы избежать получения уведомлений в моменты, когда файл журнала вращается и приложение ничего не регистрирует, я добавил проверку, чтобы увидеть, не старше ли самая старая строка журнала, чем две минуты.
Вот фрагмент важной части.
<bash lines and variable setting>
LATEST=$(gawk 'match($0, /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*<AppToMonitor>/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | tail -1 )
OLDEST=$(gawk 'match($0, /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' $LOG_TO_MONITOR | head -1)
if [ -z "$LATEST" ]
then
# no line in log
OLDEST_EPOCH=`(date --date="$OLDEST" +%s)`
CURR_MINUS_TWO=$(date +"%Y-%m-%d %T" -d "2 mins ago")
CURR_MINUS_TWO_EPOCH=`(date --date="$CURR_MINUS_TWO" +%s)`
# If oldest log line is over two minutes old
if [[ "$OLDEST_EPOCH" -lt "$CURR_MINUS_TWO_EPOCH" ]]
then
log "No lines found."
<send notification>
else
log "Server.log rotated."
fi
<else and stuff>
Я все еще получал некоторые уведомления, когда журнал вращался, и причина в том, что время эпохи было взято из совершенно пустого файла журнала. Я проверил это, создав пустой .log-файл с touch test.log
, затем установив EMPTY=$(gawk 'match($0, /\[#\|(.*[0-9]*?)T(.*[0-9]*?)\+.*INFO/, m) {print m[1], m[2];} ' /home/USER/test.log | head -1)
Теперь, если я echo $EMPTY
, я получаю пустую строку. Но если я преобразую эту пустую строку в время эпохи EPOCHEMPTY=`(date --date="$EMPTY" +%s)`
, я получу время эпохи 1584914400 из эха. Это относится ко вчерашнему вечеру. Очевидно, эта же эпоха наступает каждый раз, когда пустая дата преобразуется во время эпохи, например, заменяя «$ EMPTY» на «», по крайней мере, при написании этого.
Итак, вопрос в том, что это время эпохи из пустой строки? Когда оператор if сравнивает это значение, он запускает уведомление, хотя и не должен. Есть ли способ избежать использования пустой строки для сравнения, но есть какое-то другое значение времени из файла журнала?