Как лучше всего выполнить сравнение временных меток в Bash
Вопрос
У меня есть сценарий оповещения, который я пытаюсь уберечь от спама, поэтому я хотел бы установить условие, согласно которому, если оповещение было отправлено в течение, скажем, последнего часа, не отправлять другое оповещение.Теперь у меня есть задание 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
(Спасибо, Стив.)