Как лучше всего выполнить сравнение временных меток в Bash

StackOverflow https://stackoverflow.com/questions/205666

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть сценарий оповещения, который я пытаюсь уберечь от спама, поэтому я хотел бы установить условие, согласно которому, если оповещение было отправлено в течение, скажем, последнего часа, не отправлять другое оповещение.Теперь у меня есть задание cron, которое проверяет состояние каждую минуту, потому что мне нужно быстро получать оповещения, когда условие выполняется, но мне не нужно получать электронное письмо каждый месяц, пока я не возьму проблему под контроль.Как лучше всего сравнить время в bash для этого?

Это было полезно?

Решение

Безусловно, проще всего хранить временные метки как время изменения фиктивных файлов.ГНУ touch и date команды могут устанавливать/получать это время и выполнять вычисления дат.В Bash есть тесты, проверяющие, является ли файл новее (-nt) или старше (-ot) другой.

Например, чтобы отправить уведомление только в том случае, если последнее уведомление было более часа назад:

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi

Другие советы

Используйте «тест»:

if test file1 -nt file2; then
   # file1 is newer than file2
fi

РЕДАКТИРОВАТЬ:Если вы хотите узнать, когда произошло событие, вы можете использовать «прикосновение», чтобы создать файл, который позже можно будет сравнить с помощью «теста».

Используйте команду date, чтобы преобразовать два значения времени в стандартный формат и вычесть их.Вероятно, вы захотите сохранить предыдущее время выполнения в точечном файле, а затем сделать что-то вроде:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(Спасибо, Стив.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top