Почему существует эпоха от пустого значения? - PullRequest
1 голос
/ 23 марта 2020

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

Вот фрагмент важной части.

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

1 Ответ

1 голос
/ 23 марта 2020
Руководство

date определяет, что пустая строка, переданная в -d, будет считаться началом дня.

Однако вы можете положиться на параметр -f / --file и подстановка процесса:

date -f <(echo -n "$your_date")

Опция -f позволяет передавать файл в качестве параметров, каждая строка которого будет считаться входной для -d. Пустой файл просто вернет пустой вывод.

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

...